После того, как инструмент WiX Toolset Heat собирает компоненты из исходного каталога, он создает файл wxs, например, со следующим содержимым.
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Directory Id="dirGeneratedID1" Name="MySourceDirName">
<Component Id="cmpGeneratedID1" Guid="*">
<File Id="filGeneratedID1" KeyPath="yes" Source="$(var.SourceRootDir)\File1.dll" />
</Component>
<Component Id="cmpGeneratedID2" Guid="*">
<File Id="filGeneratedID2" KeyPath="yes" Source="$(var.SourceRootDir)\File2.dll" />
</Component>
<Directory Id="dirGeneratedID2" Name="MyNestedDirName">
<Component Id="cmpGeneratedID3" Guid="*">
<File Id="filGeneratedID3" KeyPath="yes" Source="$(var.SourceRootDir)\MyNestedDirName\File3.dll" />
</Component>
</Directory>
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
Моя задача - изменить значение атрибута Name для родительского элемента Directory. только. То есть изменить значение атрибута Name элемента / Wix / Fragment / DirectoryRef / Directory [@ Name = 'MySourceDirName'] с MySourceDirName, скажем, на MY_RENAMED_SOURCE_DIR_NAME, поэтому в результате я получаю следующее.
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="TARGETDIR">
<Directory Id="dirGeneratedID1" Name="MY_RENAMED_SOURCE_DIR_NAME">
<Component Id="cmpGeneratedID1" Guid="*">
<File Id="filGeneratedID1" KeyPath="yes" Source="$(var.SourceRootDir)\File1.dll" />
</Component>
<Component Id="cmpGeneratedID2" Guid="*">
<File Id="filGeneratedID2" KeyPath="yes" Source="$(var.SourceRootDir)\File2.dll" />
</Component>
<Directory Id="dirGeneratedID2" Name="MyNestedDirName">
<Component Id="cmpGeneratedID3" Guid="*">
<File Id="filGeneratedID3" KeyPath="yes" Source="$(var.SourceRootDir)\MyNestedDirName\File3.dll" />
</Component>
</Directory>
</Directory>
</DirectoryRef>
</Fragment>
</Wix>
Так как это инструмент Heat, который генерирует файл wxs, а имя исходного каталога было «MySourceDirName», то был создан атрибут «Имя элемента каталога», равный «MySourceDirName», который позже необходимо преобразовать в XSL в мою новую папку. имя 'MY_RENAMED_SOURCE_DIR_NAME'.
Я использую следующий XSLT, но он не работает, и я получаю сообщение об ошибке "Элемент DirectoryRef содержит неожиданный атрибут" Имя "."
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wix="http://schemas.microsoft.com/wix/2006/wi"
exclude-result-prefixes="wix">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory">
<xsl:attribute name="Name">
<xsl:choose>
<xsl:when test=". = 'MySourceDirName'">
<xsl:text>MY_RENAMED_SOURCE_DIR_NAME</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet
И результирующий файл wxs после XSLT становится неправильным и неполным файлом:
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="SciemetricDIR" Name="" />
</Fragment>
</Wix>
Если я изменю свой XSLT и добавлю xsl: copy, чтобы восстановить содержимое следующим образом (здесь я показываю только правило, затрагивающее все Содержимое XSLT)
<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
<xsl:attribute name="Name">
<xsl:choose>
<xsl:when test=". = 'MySourceDirName'">
<xsl:text>MY_RENAMED_SOURCE_DIR_NAME</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
Тогда я получаю эту ошибку: «Ошибка применения преобразования C: \ path-to-my-transform-file \ massageAfterHeatHarvesting.xsl для заготовленного WiX: Узлы атрибута и пространства имен нельзя добавить к родительскому элементу после того, как узел текста, комментария, pi или узла подэлемента уже был добавлен. MySoulutionName heat.exe 0 "
Что не так в моем XSLT? Почему он касается родительского элемента DirectoryRef, если я четко нацеливаюсь на дочерний элемент Directory под ним? Любая поддержка очень ценится. Заранее спасибо.