我是XSLT的初学者。我使用heat.exe
中的Wix toolset
来生成有效负载。
以下是生成的xml的示例1:
<PayloadGroup Id="ALC_272_662_888">
<Payload SourceFile="$(var.SourceDir4)\VISTA\WAVESGUILIB.DLL" Name="$(var.SourceDir4)\VISTA\WAVESGUILIB.DLL" />
<Payload SourceFile="$(var.SourceDir4)\VISTA\WAVESLIB.DLL" Name="$(var.SourceDir4)\VISTA\WAVESLIB.DLL" />
</PayloadGroup>
这是示例2:
<PayloadGroup Id="CS_H81_Q87">
<Payload SourceFile="$(var.SourceDir1)\CSVER.DLL" Name="$(var.SourceDir1)\CSVER.DLL" />
<Payload SourceFile="$(var.SourceDir1)\DIFXAPI.DLL" Name="$(var.SourceDir1)\DIFXAPI.DLL" />
<Payload SourceFile="$(var.SourceDir1)\HELP.TXT" Name="$(var.SourceDir1)\HELP.TXT" />
<Payload SourceFile="$(var.SourceDir1)\IIF2.INI" Name="$(var.SourceDir1)\IIF2.INI" />
</PayloadGroup>
我想创建一个转换,它将在属性Name
文本$(var.SourceDir1)
或$(var.SourceDir4)
中替换为空字符串,具体取决于哪一个将存在。
我尝试了很多东西 - 但xslt有它自己的逻辑。提前谢谢!
答案 0 :(得分:0)
这样可以解决问题:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<!-- Identity Transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@Name[contains(current(),'var.SourceDir4)') or contains(current(),'var.SourceDir1)')]">
<xsl:attribute name="Name">
<xsl:value-of select="substring-after(current(),')')"/>
</xsl:attribute>
</xsl:template>
</xsl:transform>
第一个模板(match =&#34; @ * | node()&#34;)制作一切的精确副本。第二个模板会覆盖名称为&#39;名称&#39;的任何属性。包含&#39; var.SourceDir4)&#39;或者&#39; var.SourceDir1)&#39;在它的值中,用第一次关闭后的任何内容替换属性值&#39;。&#39;。
编辑#1:添加小提琴以澄清:http://xsltransform.net/bnnZX2
编辑#2:它适用于&#39; current()&#39;用引擎&Saxons 9.5.1.6 HE&#39;使用&Saxace 9.5.1.6 EE&#39;,&#39; Saxon 6.5.5&#39;或者&#39; Xalan 2.7.1&#39;你需要使用&#39;。&#39;而不是&#39; current()&#39;,以使其工作。