XSLT替换除一个节点之外的所有节点上的属性

时间:2017-07-19 14:43:34

标签: xml xslt wix

我正在开发wix,我需要安装一个Windows服务。 作为其中的一部分,我需要仅在服务可执行文件上设置KeyPath="yes"。 我正在使用HarvestDirectory任务生成如下输出:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="INSTALLFOLDER">
            <Component Id="cmp4BB0346D363B37CAFD72ED8BBAFE3DC3" Guid="*">
                <File Id="fil1F519C40510B9CE08968AFE1141C5124" KeyPath="yes" Source="$(var.My.Awesome.Product.TargetDir)\My.Awesome.Product.dll" />
            </Component>
        <!-- Many more here -->
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="ProductFiles">
            <ComponentRef Id="cmp4BB0346D363B37CAFD72ED8BBAFE3DC3" />
            <!-- Many more here -->
        </ComponentGroup>
    </Fragment>
</Wix>

我想要做的是编写一个XSLT,将所有文件的KeyPath更改为“no”,除非Source = $(var.My.Awesome.Product.TargetDir)\My.Awesome.Product.exe

E.g。样本输出将是:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="INSTALLFOLDER">
            <Component Id="cmp4BB0346D363B37CAFD72ED8BBAFE3DC3" Guid="*">
           <!-- note the 'no' in the KeyPath here -->
                <File Id="fil1F519C40510B9CE08968AFE1141C5124" KeyPath="no" Source="$(var.My.Awesome.Product.TargetDir)\My.Awesome.Product.dll" />
            </Component>
             <Component Id="cmp5BB0346D363B37CAFD72ED8BBAFE3DC3" Guid="*">
                <File Id="fil2F519C40510B9CE08968AFE1141C5124" KeyPath="yes" Source="$(var.My.Awesome.Product.TargetDir)\My.Awesome.Product.exe" />
            </Component>
        <!-- Many more here -->
        </DirectoryRef>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="ProductFiles">
            <ComponentRef Id="cmp4BB0346D363B37CAFD72ED8BBAFE3DC3" />
            <ComponentRef Id="cmp5BB0346D363B37CAFD72ED8BBAFE3DC3" />
            <!-- Many more here -->
        </ComponentGroup>
    </Fragment>
</Wix>

我有以下XSLT在所有KeyPath属性上用'no'替换'yes':

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:wix="http://schemas.microsoft.com/wix/2006/wi">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@KeyPath">
        <xsl:attribute name="KeyPath">
            <xsl:value-of select="'no'"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

我尝试使用parentancestor和带有属性File[@KeyPath='yes']选择器的简单节点来操纵第二个模板中的匹配无效。

1 个答案:

答案 0 :(得分:2)

  

我想要做的是编写一个XSLT,将KeyPath更改为&#34; no&#34;对于所有文件,除了Source = $(var.My.Awesome.Product.TargetDir)\My.Awesome.Product.exe

该部分将写成:

<xsl:template match="wix:File[not(@Source='$(var.My.Awesome.Product.TargetDir)\My.Awesome.Product.exe')]/@KeyPath">
    <xsl:attribute name="KeyPath">
        <xsl:value-of select="'no'"/>
    </xsl:attribute>
</xsl:template>

请注意,执行您在问题开头所说的内容:

  

我只需要在服务可执行文件上设置KeyPath="yes"

我不确定这意味着什么,因为你的输入与你的输出不匹配,我更加困惑。