Поиск уникальных узлов с помощью xslt - PullRequest
2 голосов
/ 04 февраля 2010

У меня есть XML-документ, который содержит некоторые элементы «Item» с идентификаторами.Я хочу составить список уникальных идентификаторов предметов.Тем не менее, элементы Item не находятся в списке - они могут быть на любой глубине в документе XML - например:


<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.Спасибо!

Ответы [ 3 ]

5 голосов
/ 04 февраля 2010

Выбор всех уникальных элементов одним выражением XPath (без индексации, остерегайтесь проблем с производительностью):

//Item[not(@id = preceding::Item/@id)]
5 голосов
/ 04 февраля 2010

Попробуйте это (используя мюнхенская группировка ):

<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>
0 голосов
/ 04 февраля 2010

Не уверен, если вы это имеете в виду, но на всякий случай.

В html

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

Шаблон.

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