我正在开发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>
我尝试使用parent
,ancestor
和带有属性File[@KeyPath='yes']
选择器的简单节点来操纵第二个模板中的匹配无效。
答案 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"
。
我不确定这意味着什么,因为你的输入与你的输出不匹配,我更加困惑。