Установщик WiX: используя xslt сheat.exe, как изменить значение родительского идентификатора после обнаружения совпадения родитель/потомок?

У меня есть следующий источник:

<DirectoryRef Id="INSTALLDIR">
    <Component Id="acuthin.exe" Guid="{0DAD4D00-A40E-420D-B90A-B23B89B72881}">

и я хочу изменить INSTALLDIR на TARGETDIR:

<DirectoryRef Id="TARGETDIR">
    <Component Id="acuthin.exe" Guid="{0DAD4D00-A40E-420D-B90A-B23B89B72881}">

но только если идентификатор компонента = "acuthin.exe". Я пробовал следующее:

<xsl:template match="wix:DirectoryRef[@Id='INSTALLDIR']/wix:Component[@Id='acuthin.exe']">
<xsl:copy>
  <xsl:attribute name="Id">TARGETDIR</xsl:attribute>
  <xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>

но он изменил идентификатор компонента вместо DirectoryRef:

<DirectoryRef Id="INSTALLDIR">
    <Component Id="TARGETDIR">

Есть ли способ сказать ему изменить идентификатор DirectoryRef вместо этого?

Вот моя командная строка нагрева:

Heat" dir "Files\Groupacuthin.exeAutoUpdate" -dr КАТАЛОГ УСТАНОВКИ -var var.HARVESTDIR -gg -sw -nologo -scom -sreg -sfrag -srd -suid -cg "Groupacuthin.exeAutoUpdate" -t test.xslt -out "Компоненты \Groupacuthin.exeAutoUpdate.wxs"

Вот исходник до сопоставления с шаблоном:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="INSTALLDIR">
            <Component Id="acuthin.exe" Guid="{F48C7EB0-6192-4F92-8FCB-8DC8517572B5}">
                <File Id="acuthin.exe" KeyPath="yes" Source="$(var.HARVESTDIR)\acuthin.exe" />
            </Component>
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="Groupacuthin.exeAutoUpdate">
            <ComponentRef Id="acuthin.exe" />
        </ComponentGroup>
    </Fragment>
</Wix>

Спасибо!

Гэри


person Gary    schedule 05.12.2019    source источник


Ответы (3)


Что вы хотите изменить, так это атрибут Id DirectoryRef, но ваш шаблон фактически выбирает компонент, который является дочерним элементом DirectoryRef.

Измените свой шаблон на:

<xsl:template match="wix:DirectoryRef[@Id='INSTALLDIR' and wix:Component/@Id='acuthin.exe']">
    <xsl:copy>
      <xsl:attribute name="Id">TARGETDIR</xsl:attribute>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
</xsl:template>

Посмотрите, как это работает здесь: https://xsltfiddle.liberty-development.net/pPJ8LVx

person Sebastien    schedule 05.12.2019

Пожалуйста, попробуйте этот код:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="DirectoryRef">
        <DirectoryRef>
            <xsl:apply-templates select="@* except @Id"/>
            <xsl:if test="(@Id='INSTALLDIR') and /Wix/Fragment/ComponentGroup/ComponentRef[@Id='acuthin.exe']">
                <xsl:attribute name="Id" select="'TARGETDIR'"/>
            </xsl:if>
            <xsl:apply-templates/>
        </DirectoryRef>
    </xsl:template>
person Ansari    schedule 05.12.2019

Ваш @match="wix:DirectoryRef[@Id='INSTALLDIR']/wix:Component[@Id='acuthin.exe']" вместо использования @match="wix:DirectoryRef[@Id='INSTALLDIR' и wix :Компонент/@Id='acuthin.exe']"

person Ansari    schedule 05.12.2019