<xsl:number> | |
Compte des éléments. Il est généralement utilisé pour numéroter des parties d'un document, même s'il peut également servir à formater une valeur numérique. | |
Catégorie | |
Instruction |
|
Attributs obligatoires | |
Aucun. |
|
Attributs facultatifs | |
|
|
Contenu | |
Aucun. <xsl:number> est un élément vide. |
|
Apparaît dans | |
<xsl:number> apparaît dans un modèle. |
|
Défini dans | |
XSLT section 7.7, Numérotation. |
|
Exemple | |
Pour bien comprendre le fonctionnement de l'élément <xsl:number>, il faut utiliser un document XML contenant de nombreux éléments à compter. Voici le document utilisé : <?xml version="1.0"?> <book> <chapter> <title>Alfa Romeo</title> <sect1> <title>Bentley</title> </sect1> <sect1> <title>Chevrolet</title> <sect2> <title>Dodge</title> <sect3> <title>Eagle</title> </sect3> </sect2> </sect1> </chapter> <chapter> <title>Ford</title> <sect1> <title>GMC</title> <sect2> <title>Honda</title> <sect3> <title>Isuzu</title> </sect3> <sect3> <title>Javelin</title> </sect3> <sect3> <title>K-Car</title> </sect3> <sect3> <title>Lincoln</title> </sect3> </sect2> <sect2> <title>Mercedes</title> </sect2> <sect2> <title>Nash</title> <sect3> <title>Opel</title> </sect3> <sect3> <title>Pontiac</title> </sect3> </sect2> <sect2> <title>Quantum</title> <sect3> <title>Rambler</title> </sect3> <sect3> <title>Studebaker</title> </sect3> </sect2> </sect1> <sect1> <title>Toyota</title> <sect2> <title>Um, is there a car that starts with "U"?</title> </sect2> </sect1> <sect1> <title>Volkswagen</title> </sect1> </chapter> </book> L'élément <xsl:number> est utilisé de différentes manières pour illustrer les nombreuses options disponibles de numérotation des éléments. Observons la feuille de style et les résultats pour pouvoir ensuite les commenter. La feuille de style est la suivante : <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:variable name="newline"> <xsl:text> </xsl:text> </xsl:variable> <xsl:template match="/"> <xsl:value-of select="$newline"/> <xsl:apply-templates select="book" mode="number-1"/> <xsl:apply-templates select="book" mode="number-2"/> <xsl:apply-templates select="book" mode="number-3"/> <xsl:apply-templates select="book" mode="number-4"/> <xsl:apply-templates select="book" mode="number-5"/> <xsl:apply-templates select="book" mode="number-6"/> <xsl:apply-templates select="book" mode="number-7"/> </xsl:template> <xsl:template match="book" mode="number-1"> <xsl:text>Test #1: level="multiple", count="chapter|sect1|sect2|sect3", format="1.1.1.1. "</xsl:text> <xsl:value-of select="$newline"/> <xsl:value-of select="$newline"/> <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3"> <xsl:number level="multiple" count="chapter|sect1|sect2|sect3" format="1.1.1.1. "/> <xsl:value-of select="title"/> <xsl:value-of select="$newline"/> </xsl:for-each> <xsl:value-of select="$newline"/> </xsl:template> <xsl:template match="book" mode="number-2"> <xsl:text>Test #2: level="any", count="chapter|sect1|sect2|sect3", format="1. "</xsl:text> <xsl:value-of select="$newline"/> <xsl:value-of select="$newline"/> <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3"> <xsl:number level="any" count="chapter|sect1|sect2|sect3" format="1. "/> <xsl:value-of select="title"/> <xsl:value-of select="$newline"/> </xsl:for-each> <xsl:value-of select="$newline"/> </xsl:template> <xsl:template match="book" mode="number-3"> <xsl:text>Test #3: level="single", count="chapter|sect1|sect2|sect3", format="1.1.1.1. "</xsl:text> <xsl:value-of select="$newline"/> <xsl:value-of select="$newline"/> <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3"> <xsl:number level="single" count="chapter|sect1|sect2|sect3" format="1.1.1.1. "/> <xsl:value-of select="title"/> <xsl:value-of select="$newline"/> </xsl:for-each> <xsl:value-of select="$newline"/> </xsl:template> <xsl:template match="book" mode="number-4"> <xsl:text>Test #4: level="multiple", select=".//sect2", count="chapter|sect1|sect2", format="I-A-i: "</xsl:text> <xsl:value-of select="$newline"/> <xsl:value-of select="$newline"/> <xsl:for-each select=".//sect2"> <xsl:number level="multiple" count="chapter|sect1|sect2" format="I-A-i: "/> <xsl:value-of select="title"/> <xsl:value-of select="$newline"/> </xsl:for-each> <xsl:value-of select="$newline"/> </xsl:template> <xsl:template match="book" mode="number-5"> <xsl:text>Test #5: level="any", count="[various elements]" from="[various elements]" format="1.1.1.1. "</xsl:text> <xsl:value-of select="$newline"/> <xsl:value-of select="$newline"/> <xsl:for-each select=".//sect3"> <xsl:number level="any" from="book" count="chapter" format="1."/> <xsl:number level="any" from="chapter" count="sect1" format="1."/> <xsl:number level="any" from="sect1" count="sect2" format="1."/> <xsl:number level="any" from="sect2" count="sect3" format="1. "/> <xsl:value-of select="title"/> <xsl:value-of select="$newline"/> </xsl:for-each> <xsl:value-of select="$newline"/> </xsl:template> <xsl:template match="book" mode="number-6"> <xsl:text>Test #6: level="any", count="chapter|sect1|sect2|sect3", grouping-separator=",", using a variable to start counting at 1000.</xsl:text> <xsl:value-of select="$newline"/> <xsl:value-of select="$newline"/> <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3"> <xsl:variable name="value1"> <xsl:number level="any" count="chapter|sect1|sect2|sect3"/> </xsl:variable> <xsl:number value="$value1 + 999" grouping-separator="." grouping-size="3"/> <xsl:text>. </xsl:text> <xsl:value-of select="title"/> <xsl:value-of select="$newline"/> </xsl:for-each> <xsl:value-of select="$newline"/> </xsl:template> <xsl:template match="book" mode="number-7"> <xsl:text>Test #7: level="multiple", count="chapter|sect1|sect2|sect3", format="1.1.1.1. ", selecting up to the first two <sect1> elements from chapter 2.</xsl:text> <xsl:value-of select="$newline"/> <xsl:value-of select="$newline"/> <xsl:for-each select="chapter[2]/sect1[position() < 3]"> <xsl:for-each select="chapter|.//sect1|.//sect2|.//sect3"> <xsl:number level="multiple" count="chapter|sect1|sect2|sect3" format="1.1.1.1. "/> <xsl:value-of select="title"/> <xsl:value-of select="$newline"/> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet> Les résultats sont les suivants : Test #1: level="multiple", count="chapter|sect1|sect2|sect3", format="1.1.1.1. " 1. Alfa Romeo 1.1. Bentley 1.2. Chevrolet 1.2.1. Dodge 1.2.1.1. Eagle 2. Ford 2.1. GMC 2.1.1. Honda 2.1.1.1. Isuzu 2.1.1.2. Javelin 2.1.1.3. K-Car 2.1.1.4. Lincoln 2.1.2. Mercedes 2.1.3. Nash 2.1.3.1. Opel 2.1.3.2. Pontiac 2.1.4. Quantum 2.1.4.1. Rambler 2.1.4.2. Studebaker 2.2. Toyota 2.2.1. Um, is there a car that starts with "U"? 2.3. Volkswagen Test #2: level="any", count="chapter|sect1|sect2|sect3", format="1. " 1. Alfa Romeo 2. Bentley 3. Chevrolet 4. Dodge 5. Eagle 6. Ford 7. GMC 8. Honda 9. Isuzu 10. Javelin 11. K-Car 12. Lincoln 13. Mercedes 14. Nash 15. Opel 16. Pontiac 17. Quantum 18. Rambler 19. Studebaker 20. Toyota 21. Um, is there a car that starts with "U"? 22. Volkswagen Test #3: level="single", count="chapter|sect1|sect2|sect3", format="1.1.1.1. " 1. Alfa Romeo 1. Bentley 2. Chevrolet 1. Dodge 1. Eagle 2. Ford 1. GMC 1. Honda 1. Isuzu 2. Javelin 3. K-Car 4. Lincoln 2. Mercedes 3. Nash 1. Opel 2. Pontiac 4. Quantum 1. Rambler 2. Studebaker 2. Toyota 1. Um, is there a car that starts with "U"? 3. Volkswagen Test #4: level="multiple", select=".//sect2", count="chapter|sect1|sect2", format="I-A-i: " I-B-i: Dodge II-A-i: Honda II-A-ii: Mercedes II-A-iii: Nash II-A-iv: Quantum II-B-i: Um, is there a car that starts with "U"? Test #5: level="any", count="[various elements]" from="[various elements]" format="1.1.1.1. " 1.2.1.1. Eagle 2.1.1.1. Isuzu 2.1.1.2. Javelin 2.1.1.3. K-Car 2.1.1.4. Lincoln 2.1.3.1. Opel 2.1.3.2. Pontiac 2.1.4.1. Rambler 2.1.4.2. Studebaker Test #6: level="any", count="chapter|sect1|sect2|sect3", grouping-separator=",", using a variable to start counting at 1000. 1,000. Alfa Romeo 1,001. Bentley 1,002. Chevrolet 1,003. Dodge 1,004. Eagle 1,005. Ford 1,006. GMC 1,007. Honda 1,008. Isuzu 1,009. Javelin 1,010. K-Car 1,011. Lincoln 1,012. Mercedes 1,013. Nash 1,014. Opel 1,015. Pontiac 1,016. Quantum 1,017. Rambler 1,018. Studebaker 1,019. Toyota 1,020. Um, is there a car that starts with "U"? 1,021. Volkswagen Test #7: level="multiple", count="chapter|sect1|sect2|sect3", format="1.1.1.1. ", selecting up to the first two <sect1> elements from chapter 2. 2.1. GMC 2.1.1. Honda 2.1.1.1. Isuzu 2.1.1.2. Javelin 2.1.1.3. K-Car 2.1.1.4. Lincoln 2.1.2. Mercedes 2.1.3. Nash 2.1.3.1. Opel 2.1.3.2. Pontiac 2.1.4. Quantum 2.1.4.1. Rambler 2.1.4.2. Studebaker 2.2. Toyota 2.2.1. Um, is there a car that starts with "U"? Dans le test 1, level="multiple" a permis de compter les éléments <chapter>, <sect1>, <sect2> et <sect3>. En les numérotant sur plusieurs niveaux, on a obtenu un nombre décimal pointé pour chaque élément. Il suffit de regarder le nombre qui suit Studebaker pour voir qu'il s'agit du deuxième élément <sect3> à l'intérieur du quatrième élément <sect2> du premier élément <sect1> du second élément <chapter>. Dans le test 2, level="any" a permis de compter tous les éléments <chapter>, <sect1>, <sect2> et <sect3> dans l'ordre. Dans le test 3, level="single" a permis de compter les éléments de chaque niveau. Cela signifie que le quatrième élément <sect3> d'un élément <sect2> donné sera numéroté 4 (ou iv ou bien D ou quelque soit la valeur appropriée). Le nombre utilisé pour chaque élément est identique au dernier nombre situé en regard de chaque élément dans le Test 1. Certains éléments diffèrent dans le test 4 : tout d'abord, on a utilisé les styles de numérotation romaine minuscule et alphabétique majuscule. Deuxièmement, on a compté les éléments sur plusieurs niveaux (pour les éléments <chapter>, <sect1> et <sect2>), mais seuls les éléments <sect2> ont été traités. Même si seul le texte du titre a été généré pour les éléments <sect2>, il est toujours possible de générer les numéros multiniveaux appropriés. Le test 5 génère des nombres identiques à ceux du test 4, sauf qu'on a utilisé l'attribut from. Les numéros des éléments <sect3> ont été généré en quatre étapes ; tout d'abord, on a compté les ancêtres <chapter>, en commençant par le premier ancêtre <book> ; puis, on a compté les ancêtres <sect1>, en commençant par le premier ancêtre <chapter>, etc. Le test 6 commence le comptage à partir de 1000 au lieu de 1. Pour ce faire, il a fallu enregistrer la valeur générée par <xsl:number> dans une variable, puis générér la valeur de la variable plus 1000. Il est possible d'utiliser une expression dans l'attribut value de l'élément <xsl:number>. L'attribut grouping-separator utilisé a également permis de séparer des groupes de trois chiffres avec une virgule. Enfin et surtout, le test 7 numérote uniquement les éléments des premier et second éléments <sect1> (éléments <sect1> dont l'attribut position() est inférieur à 3) dans le second élément <chapter>. Même si seules ces sections sont traitées, il est toujours possible d'utiliser <xsl:number> pour générer les numéros corrects des éléments. |