Я пытаюсь использовать XSLT для обновления XML-файла (сгенерированного WiX). Я работаю почти отлично. Но я нашел внутреннюю ссылку, которую мне также нужно заменить, и это немного сложнее.XSLT - изменение атрибута (регулярное выражение?)
Вкратце, я добавляю _32x к значению Id в нескольких узлах XML. Но я нашел ссылку в XML в Id, которая также должна быть добавлена.
То есть, исходный XML-файл (значительно упрощен и с другими атрибутами удалены):
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="WEBINSTALLFOLDER">
<Directory Id="dir1DB31186637C634CBA8E0643DF80869C">
<Component Id="cmp65024F0DF585708F9ABEBE2F58FF64BA">
<File Id="fil8C400D2459FD744947D08FD584B820E4" />
<RegistryValue Value="ASP.dashboard_aspx" />
<RegistryValue Value="App_Web_10b5qifx" />
<RegistryValue Value="v4.0.30319" />
<RegistryValue Value="file:///[#fil8C400D2459FD744947D08FD584B820E4]" />
</Component>
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
Мой XSLT добавляет _32x к значениям Id в компоненте и файлы корректно (и добавляет ссылку определений. wxi). Все это работает отлично, но я также должен изменить любой узел RegistryValue со значением «file: /// [# ...» с новым значением, которое заменяет «] 'на« _32x] ».
То есть, новый тег должен быть:
<RegistryValue Value="file:///[#fil8C400D2459FD744947D08FD584B820E4_32x]" />
Мой текущий XSLT является:
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="wix:Wix">
<xsl:copy>
<xsl:processing-instruction name="include">..\Definitions.wxi</xsl:processing-instruction>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!-- Identity transform. -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="@Id[parent::wix:Component]">
<xsl:attribute name="Id">
<xsl:value-of select="." />
<xsl:text>_32x</xsl:text>
</xsl:attribute>
</xsl:template>
<xsl:template match="@Id[parent::wix:File]">
<xsl:attribute name="Id">
<xsl:value-of select="." />
<xsl:text>_32x</xsl:text>
</xsl:attribute>
</xsl:template>
И последний XML ПРЯМО СЕЙЧАС, без коррекции на RegistryValue является:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include ..\Definitions.wxi?>
<Fragment>
<DirectoryRef Id="WEBINSTALLFOLDER">
<Directory Id="dir1DB31186637C634CBA8E0643DF80869C">
<Component Id="cmp65024F0DF585708F9ABEBE2F58FF64BA_32x">
<File Id="fil8C400D2459FD744947D08FD584B820E4_32x" />
<RegistryValue Value="ASP.dashboard_aspx" />
<RegistryValue Value="App_Web_10b5qifx" />
<RegistryValue Value="v4.0.30319" />
<RegistryValue Value="file:///[#fil8C400D2459FD744947D08FD584B820E4]" />
</Component>
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
Я довольно новичок в XSLT, поэтому не знаю, как выполнить замену на значение узла RegistryValue, когда в частности, файл: /// [# .. и выполните замену.
Это происходит снова и снова в моем XML-файле с разными фактическими идентификаторами файлов, поэтому простая жестко закодированная замена констант невозможна.
Спасибо
Вы не упомянули ли вы в состоянии использовать XSLT 2.0, что делает этот вид вещи очень просто. –