<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
count
L'attribut count est une expression XPath qui définit les éléments à compter.

level
Cet attribut définit les niveaux de l'arborescence source dont il faudra tenir compte lors de la numérotation des éléments. Les trois valeurs valides de cet attribut sont single, multiple et any :

single
Compte les éléments d'un seul niveau uniquement. Le processeur XSLT accède au premier nœud de l'axe ancestor-or-self correspondant à l'attribut count, puis compte ce nœud plus tous les frères précédents de ce nœud qui correspondent également à l'attribut count.

multiple
Compte les éléments sur plusieurs niveaux. Le processeur XSLT examine tous les ancêtres du nœud actif et le nœud actif lui-même, puis sélectionne tous les nœuds correspondant à l'attribut count.

any
Inclut tous les ancêtres du nœud actif (comme le fait level= " multiple ") ainsi que tous les éléments de l'axe preceding.

Dans tous les cas, si l'attribut from est utilisé, les seuls ancêtres examinés sont les descendants de l'ancêtre le plus proche correspondant à l'attribut from. En d'autres termes, avec from= " h1 ", les seuls nœuds pris en compte pour le comptage sont ceux qui apparaissent sous l'attribut < h1 > le plus proche.

from
L'attribut from est une expression XPath qui définit où commence le comptage. Par exemple, vous pouvez utiliser l'attribut from pour indiquer que le comptage doit démarrer au précédent élément < h1 >.

value
Une expression qui est convertie en nombre. Utiliser cet attribut permet de formater rapidement un nombre ; l'élément < xsl:number value= " 7 " format= " i: " / > renvoie la chaîne " vii: " .

format
L'attribut format définit le format du nombre généré :

format= " 1 "
Formate une séquence de nombres sous la forme 1 2 3 4 5 6 7 8 9 10 11 ... .

format= " 01 "
Formate une séquence de nombres sous la forme 01 02 03 04 ... 09 10 11 ... 99 100 101 ... .

format= " a "
Formate une séquence de nombres sous la forme a b c d e f ... x y z aa ab ac ... .

format= " A "
Formate une séquence de nombres sous la forme A B C D E F ... X Y Z AA AB AC ... .

format= " i "
Formate une séquence de nombres sous la forme i ii iii iv v vi vii viii ix x ... .

format= " I "
Formate une séquence de nombres sous la forme I II III IV V VI VII VIII IX X ... .

format= " anything else "
Le fonctionnement de cet attribut dépend du processeur XSLT utilisé. La spécification XSLT répertorie plusieurs autres modèles de numérotation (chiffres Thaï, numérotation Katakana, numérotation traditionnelle hébreuse, etc.) ; consultez la documentation du processeur XSLT pour connaître le format pris en charge. Si le processeur XSLT ne prend pas en charge le modèle de numérotation demandé, la spécification XSLT exige d'utiliser format= " 1 " comme valeur par défaut.

lang
L'attribut lang définit le langage dont l'alphabet doit être utilisé. De nombreux processeurs XSLT prenant en charge différentes valeurs de langage, consultez la documentation de votre processeur XSLT favori pour plus d'informations.

letter-value
Cet attribut possède la valeur alphabetic ou traditional. De nombreux langages utilisent des modèles de numérotation à deux lettres ; l'une des lettres affecte des valeurs numériques dans une séquence alphabétique alors que l'autre utilise une tradition propre à ce langage. (les chiffres romains, un modèle de numérotation à une lettre qui n'utilise pas d'ordre alphabétique, en sont un exemple). La valeur par défaut de cet attribut est alphabetic.

grouping-separator
Cet attribut correspond au caractère à utiliser entre des groupes de chiffres dans un nombre généré. La valeur par défaut est la virgule ( , ).

grouping-size
Cet attribut définit le nombre de chiffres figurant dans chaque groupe ; la valeur par défaut est 3.

 
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.