Невозможно изменить значение атрибута Name элемента Directoryref / Directory после сбора Wix с помощью инструмента Heat - PullRequest
0 голосов
/ 29 апреля 2020

После того, как инструмент 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 под ним? Любая поддержка очень ценится. Заранее спасибо.

1 Ответ

1 голос
/ 29 апреля 2020

XSLT-процессор сталкивается с элементом Directory, а затем, как указано, создает атрибут Name и ничего больше (он останавливается).

Попробуйте изменить

<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory">

на

<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory/@Name">

На самом деле, лучше переместить условное выражение в атрибут match в качестве предиката:

<xsl:template match="/wix:Wix/wix:Fragment/wix:DirectoryRef/wix:Directory/@Name[.='MySourceDirName']">
  <xsl:attribute name="Name">MY_RENAMED_SOURCE_DIR_NAME</xsl:attribute>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...