2010-02-04 3 views
2

У меня есть XML-документ, содержащий элементы «Item» с идентификаторами. Я хочу составить список уникальных идентификаторов 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

// Item [генерировать-идентификатор() = генерировать-идентификатор (ключ ('пункт -id ', @id) [1]))] является более кратким и менее трудоемким. – Erlock

+0

интересно, я этого не знал, ты! –

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 –

Смежные вопросы