XSL 2.0仅输出第一个重复节点

时间:2017-03-25 01:39:48

标签: xslt

我尝试搜索与重复节点相关的线程并且几乎能够实现,它避免了重复节点,但它输出了最后一个重复节点而不是重复列表中的第一个节点(希望这是有意义的)。 请告诉我这里做错了/错过了什么?

    =====XML =====
    <node id="j0dp1s8s">
        <name key="">ABC</name> 
        <link type="page" target="">
            <value>abc/index</value>
        </link>
    </node>
    <node id="j0dp1s8se">
        <name key="">DEF</name> 
        <link type="page" target="">
            <value>def/index</value>
        </link>
    </node>
    <node id="j0dp1s92">
        <name key="">XYZ</name> 
        <link type="page" target="">
            <value>abc/index</value>
        </link>
    </node>

    =======XSL=============
    <xsl:variable name="unique-list" select="link[not(value=following::link/value)]" />  
    <xsl:for-each select="$unique-list">
        <li><a href="#"><xsl:value-of select="../name" /></a></li>
    </xsl:for-each>

Output: 
DEF
XYZ

Desired Output:
ABC
DEF

1 个答案:

答案 0 :(得分:2)

<强>的Prolog

  • 您的源XML无效。 name [已弃用]
  • 无法关闭元素label
  • 我没有表现出你的错误,我只是为你提供了一个更简单,更有效的代码
  • 我添加了一个根nodes以使您的源XML有效

<强> XSLT:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output method="html"/>

    <xsl:template match="nodes">
        <ul>
            <xsl:for-each-group select="node" group-by="link/value">
              <li><a href="#"><xsl:value-of select="name" /></a></li>
            </xsl:for-each-group>
        </ul>        
    </xsl:template>

</xsl:transform>

因此您可以使用XSLT 2,享受它的简单功能。 https://www.w3.org/TR/xslt20/#element-for-each-group