XSLT (opérations avancées) : Numérotation et ordonnancement

La fonction position() de XPATH

FondamentalA quoi sert-elle ?

Cette fonction permet de déterminer la position du nœud courant parmi les autres nœuds sélectionnés par une instruction XPath.

Remarque"item[position() = x]" <=> "item[x]"

Sans nécessairement le savoir, vous utilisez cette fonction à chaque fois que vous cherchez à accéder à un élément particulier dans une séquence de nœuds.

CTRL+C pour copier, CTRL+V pour coller
1
<!-- Ces deux instructions sont semblables -->
2
3
<xsl:template match="item[position() = 2]"><!-- ... --></xsl:template>
4
5
<xsl:template match="item[2]"><!-- ... --></xsl:template>
<!-- Ces deux instructions sont semblables -->

<xsl:template match="item[position() = 2]"><!-- ... --></xsl:template>

<xsl:template match="item[2]"><!-- ... --></xsl:template>

ExempleNumérotation d'un groupe de personnes

En y réfléchissant, il semble possible d'utiliser cette fonction pour numéroter certains nœuds d'un arbre XML.

Prenons l'exemple suivant, il s'agira d'obtenir un fichier XML en sortie où chaque personne possédera un attribut "id" contenant sa position.

Contenu du fichier XML source : 

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
2
<persons>
3
    <person>
4
        <name>Stevie</name>
5
    </person>
6
    <person>
7
        <name>Roy</name>
8
    </person>
9
    <person>
10
        <name>Peter</name>
11
    </person>
12
</persons>
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person>
        <name>Stevie</name>
    </person>
    <person>
        <name>Roy</name>
    </person>
    <person>
        <name>Peter</name>
    </person>
</persons>

Extrait du fichier XSLT :

CTRL+C pour copier, CTRL+V pour coller
1
...
2
        <xsl:template match="persons">
3
            <persons>
4
                <xsl:apply-templates/>
5
            </persons>
6
        </xsl:template>
7
        
8
        <xsl:template match="person">
9
            <xsl:copy>
10
                <xsl:attribute name="id">
11
                    <xsl:value-of select="position()"/>
12
                </xsl:attribute>
13
                <xsl:apply-templates/>
14
            </xsl:copy>
15
        </xsl:template>
16
        
17
        <xsl:template match="name">
18
            <xsl:copy-of select="."/>
19
        </xsl:template> 
20
...
...
        <xsl:template match="persons">
            <persons>
                <xsl:apply-templates/>
            </persons>
        </xsl:template>
        
        <xsl:template match="person">
            <xsl:copy>
                <xsl:attribute name="id">
                    <xsl:value-of select="position()"/>
                </xsl:attribute>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:template>
        
        <xsl:template match="name">
            <xsl:copy-of select="."/>
        </xsl:template> 
...

Contenu du fichier XML obtenu en sortie :

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?><persons>
2
    <person id="2">
3
        <name>Stevie</name>
4
    </person>
5
    <person id="4">
6
        <name>Roy</name>
7
    </person>
8
    <person id="6">
9
        <name>Peter</name>
10
    </person>
11
</persons>
<?xml version="1.0" encoding="UTF-8"?><persons>
    <person id="2">
        <name>Stevie</name>
    </person>
    <person id="4">
        <name>Roy</name>
    </person>
    <person id="6">
        <name>Peter</name>
    </person>
</persons>

AttentionPourquoi 2,4,6 et non 1,2,3 ?

Le résultat de la fonction position() n'est pas toujours évidente !

Chaque espace séparant deux éléments du fichier source peut être considéré comme un nœud texte à part entière.

Il faut donc garder à l'esprit que lorsque l'on demande au processeur de sélectionner les fils d'un certain nœuds, le sous-arbre généré ne contient pas nécessairement que des nœuds éléments.

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Benoît Villain, Thibault Brocheton, Lucas Charrier, Félix Motot, 2013-2016 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)