2010-02-04 7 views
2

J'ai un document XML qui contient des éléments "Item" avec des identifiants. Je veux faire une liste des ID uniques de l'article. Les éléments de l'article ne sont pas dans une liste bien - ils peuvent être à toute profondeur dans le document XML - par exemple:Recherche de nœuds uniques avec xslt


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

Je voudrais la sortie 1,2,3 (ou une représentation similaire). Si cela peut être fait avec un seul xpath alors encore mieux!

J'ai vu des exemples de ceci pour les listes d'éléments frères, mais pas pour une structure arborescente xml générale. Je suis également limité à l'utilisation des méthodes xslt 1.0. Merci!

Répondre

5

Sélection de tous les éléments uniques avec une seule expression XPath (sans indexation, méfiez-vous des problèmes de performance):

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

Essayez ceci (en utilisant 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

// article [generate-id() = générer-id (clé ('article -id ', @id) [1]))] est plus concis et prend moins de temps. – Erlock

+0

intéressant, je ne savais pas ça, ty! –

0

Je ne sais pas si cela est ce que vous voulez dire, mais juste au cas où.

Dans le html

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

Le modèle.

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

qui ne fonctionnera pas, car vous n'avez pas d'élément 'id'; OP veut que les valeurs @id uniques soient affichées –

Questions connexes