La numérotation simple avec xsl:number
Introduction
Comme nous venons de le voir, la fonction position ne se prête pas réellement à l'exercice de la numérotation même si elle offre une alternative envisageable dans les cas les plus simples.
Une instruction a spécifiquement été conçue pour faire de la numérotation : xsl:number.
Fondamental : Numérotation
L'instruction xsl:number réalise deux choses :
Elle fonctionne comme un compteur et permet donc d'évaluer l'indice du nœud courant;
Elle transforme l'indice déterminé en chaîne de caractère via des règles de conversion explicitées par le format d'affichage choisi.
Le résultat retourné est un nœud texte.
Complément : Principaux attributs de xsl:number
format : spécifie le format à utiliser pour chaque nombre figurant dans la liste.
level : spécifie les niveaux de l'arborescence source à prendre en considération.
Valeurs possibles : "single", "multiple" et "any". ("single" par défaut).
count : spécifie les nœuds à compter à ces niveaux.
from : spécifie où commence le comptage.
Pour plus d'informations sur les attributs de xsl:number, je vous invite à jeter un œil sur : https://msdn.microsoft.com/fr-fr/library/ms256084%28v=vs.120%29.aspx
Exemple : Numérotation d'une liste
Dans cet exemple nous souhaitons récupérer un ensemble d'items pour pouvoir afficher leurs contenus précédés d'une numérotation romaine dépendante de leurs positions dans la liste de nœuds sélectionnés par le for-each.
Voici le XML source :
Voici le XSLT servant à faire la transformation :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" indent="yes" encoding="iso-8859-1"/>
<xsl:template match="items">
<xsl:for-each select="item">
<xsl:number format="I) "/>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/> <xsl:template match="items"> <xsl:for-each select="item"> <xsl:number format="I) "/> <xsl:value-of select="."/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Voici le XML en sortie :