如何操作XML文档中的属性

时间:2016-03-23 05:24:27

标签: xml xslt substring

我是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有它自己的逻辑。提前谢谢!

1 个答案:

答案 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;,以使其工作。