在包含反斜杠的“测试”字符串中使用XSLT变量

时间:2018-08-22 18:16:13

标签: xslt

我正在尝试编写一个与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”字符串,因此我想将变量设置为该值。

在这一点上,我怀疑此操作使用的语法错误,但到目前为止,我尝试查找文档以澄清问题的尝试均未成功。

1 个答案:

答案 0 :(得分:1)

只需使用concat函数@Source = concat("SourceDir\", $targetFile)