从输入XSLT

时间:2017-02-03 11:40:10

标签: xslt

例如,输入是:

<root>
<command name="comm1">aa</command>
<command name="comm2">bb</command>
<command name="comm3">cc</command>
<command name="comm3">dd</command>
<command name="comm2">ee</command>
<command name="comm1">ff</command>
<command name="comm5">gg</command>
</root>

所需的输出是:

<root>
<command name="comm1">aa</command>
<command name="comm2">bb</command>
<command name="comm3">cc</command>
<command name="comm5">gg</command>
</root>

你可以看到,在输出中,我们没有重复的标签,文本值在这里并不重要。

1 个答案:

答案 0 :(得分:0)

如果您有权访问XSLT 2.0,最简单的方法是使用身份转换(假设您在此转换中执行此任务)。您需要两个模板:

<xsl:template match="@*|node()">
  <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="command[preceding-sibling::command[@name = current()/@name]]"/>

第一个模板将输入复制到输出不变。第二个模板会抑制所有<command>个元素,其中<command>个元素的@name属性值相同。

如果您只能访问XSLT 1.0,我们可以用以下内容替换第二个模板:

<xsl:template match="command">
  <xsl:if test="not(preceding-sibling::command[@name = current()/@name])">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>      
  </xsl:if>
</xsl:template>

(还有其他方法但很简单)