2010-02-04 70 views
2

我有一個xml文檔,其中包含一些帶有ID的「Item」元素。我想列出唯一的Item ID列表。 Item元素不在列表雖然 - 它們可以是在XML文檔內的任何深度 - 例如:使用xslt查找唯一節點


<Node> 
    <Node> 
    <Item id="1"/> 
    <Item id="2"/> 
    </Node> 
    <Node> 
    <Item id="1"/> 
    <Node> 
     <Item id="3"/> 
    </Node> 
    </Node> 
    <Item id="2"/> 
</Node> 

我想輸出1,2,3(或類似的表示)。如果這可以用一個xpath完成,那麼甚至更好!

我已經看到了這個兄弟元素列表的例子,但不是一般的xml樹結構。我也受限於使用xslt 1.0方法。謝謝!

回答

5

選擇用一個XPath表達式的所有獨特的項目(不包括索引,謹防性能問題):

//Item[not(@id = preceding::Item/@id)] 
5

試試這個(使用Muenchian grouping):如果

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="item-id" match="Item" use="@id" /> 
    <xsl:template match="/Node"> 
     <xsl:for-each select="//Item[count(. | key('item-id', @id)[1]) = 1]"> 
      <xsl:value-of select="@id" />, 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+3

//項目[生成-ID()=生成-ID(鍵(「項目-id',@id)[1]))]更簡潔,更省時。 – Erlock 2010-02-04 13:39:47

+0

有趣,我不知道,ty! – 2010-02-04 13:56:09

0

不知道這是你的意思,但以防萬一。

在HTML

<xsl:apply-templates select="item"/> 

模板。

<xsl:template match="id"> 
     <p> 
     <xsl:value-of select="@id"/> - 
     <xsl:value-of select="."/> 
     </p> 
    </xsl:template> 
+0

不會工作,因爲你沒有'id'元素; OP希望顯示唯一的@id值 – 2010-02-04 12:48:42