我正在尝试编写一个与Wix Harvest工具(heat.exe)一起使用的XSLT文件。下面是该工具生成的XML的伪代码示例:
scanf_s("%s", str, 20);
我想在Source属性为<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<DirectoryRef Id="APPLICATIONFOLDER">
<Component Id="component1" Guid="{guidstring1}">
<File Id="file1" Source="SourceDir\target.exe" KeyPath="yes" />
</Component>
<Component Id="component2" Guid="{guidstring2}">
<File Id="file2" Source="SourceDir\otherfile.txt" KeyPath="yes" />
</Component>
的File中添加一个Shortcut子节点,同时将其他Files的KeyPath属性设置为SourceDir\target.exe
。 (How to create shortcuts to files harvested by heat.exe?被用作此尝试的基础)
以下是我到目前为止的XSLT文件的摘录。参数no
通常是动态设置的,但为了举例说明,我将其定义为静态字符串。
targetFile
当我显式设置<xsl:param name="targetFile" select="'target.exe'" />
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match='//wixns:Component/wixns:File[@Source]'>
<xsl:choose>
<xsl:when test='not (@Source = SourceDir\target.exe)'>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="KeyPath">
<xsl:text>no</xsl:text>
</xsl:attribute>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<Shortcut
Id="startmenuShortcut"
xmlns="http://schemas.microsoft.com/wix/2006/wi"
Directory="ProgramMenuDir"
WorkingDirectory="APPLICATIONFOLDER"
Name="Target"
Icon="target.exe"
IconIndex="0"
Advertise="yes"
/>
</xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
测试字符串时,此XSLT文件完成了我想要的操作。但是,我想使用一开始定义的“ targetFile”参数。我的第一次尝试是使用以下内容:
when
这导致了错误
<xsl:when test='not (@Source = SourceDir\$targetFile)'>
用Expected token ')', found '\'. not (@Source = SourceDir -->\<-- $targetFile)
像{}
包围变量有相似的结果。试图将整个搜索字符串都用引号引起来
{$targetFile}
没有正确识别File组件,只是将KeyPath属性修改应用于所有内容。
将变量设置为<xsl:when test='not (@Source = "SourceDir\$targetFile")'>
,然后将测试设置为
<xsl:param name="targetFile" select="'SourceDir\target.exe'" />
进行了正确的修改,但是我想在XSLT文件的其他位置使用“ target.exe”字符串,因此我想将变量设置为该值。
在这一点上,我怀疑此操作使用的语法错误,但到目前为止,我尝试查找文档以澄清问题的尝试均未成功。
答案 0 :(得分:1)
只需使用concat
函数@Source = concat("SourceDir\", $targetFile)
。