2010-10-27 3 views
1

Disons que vous avez un document XML commeobtenir la position de l'élément() quel que soit parent

<parents> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
</parents> 

Alors que le traitement que je dois savoir que les éléments sont 1, 2, 3, 4 dans le document, pas mais appelant position() retournera 1, 2, 1, 2. Normalement, je voudrais modifier le XML, mais, dans ce cas, il n'est pas possible, alors que je suis le traitement parent 2, je dois savoir en quelque sorte que c'est le premier élément, est vraiment élément 3.

Merci, -c

+0

Bonne question, +1. Voir ma réponse pour une solution complète et vraiment XSLT. :) –

Répondre

4

Utilisez <xsl:number>

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="element"> 
    <xsl:copy> 
     <xsl:number level="any" count="element"/> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document XML fourni:

<parents> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
    <parent> 
     <element /> 
     <element /> 
    </parent> 
</parents> 

produit le résultat recherché:

<parents> 
    <parent> 
     <element>1</element> 
     <element>2</element> 
    </parent> 
    <parent> 
     <element>3</element> 
     <element>4</element> 
    </parent> 
</parents> 
+1

+1 Bonne réponse. –

1

Got, il est en fait assez simple

<xsl:value-of select="count(preceding::element)"/> 
+0

Cela ne sera pas correct si un '' contient un autre '' –

+0

@Dimitre Novatchev, dans ma situation ce ne sera pas, mais j'ai utilisé votre solution dans mon code de toute façon. – CaffGeek

+0

+1 Une autre approche. Pour 'element' imbriqué, vous pouvez utiliser:' count (previous :: element | ancestor :: element) '. Mais, notez que pour les restrictions de hiérarchie complexes (ne comptant pas sur l'arbre entier mais sur un ancêtre), l'expression peut devenir très complexe. Car c'est xsl: number/@ level et xsl: number/@ from. –

Questions connexes