<xsl:number> |
Diese Anweisung dient zum Zählen. Sie wird meist dafür verwendet, Teile eines Dokuments zu nummerieren, wenngleich sie auch zur Formatierung eines numerischen Werts dienen kann.
Kategorie
Anweisung
Obligatorische Attribute
Keine
Optionale Attribute
count Das Attribut count ist ein XPath-Ausdruck, der definiert, was gezählt werden soll. level Dieses Attribut definiert, welche Ebenen des Ausgangsbaums beim Nummerieren von Elementen berücksichtigt werden sollen. Die drei Werte für dieses Attribut sind single , multiple und any : single Zählt nur die Elemente einer Ebene. Der XSLT-Prozessor geht zunächst zum ersten Knoten auf der Achse ancestor-or-self , der dem Attribut count entspricht, dann zählt er diesen Knoten plus alle Parallelknoten davor, die ebenfalls dem Attribut count entsprechen. multiple Zählt Elemente auf mehreren Ebenen. Der XSLT-Prozessor durchsucht alle Vorfahren des aktuellen Knotens sowie den aktuellen Knoten selbst und wählt daraus alle Knoten aus, die dem Attribut count entsprechen. any Umfasst alle Vorfahren des aktuellen Knotens (ebenso wie level= " multiple " ) sowie alle Elemente auf der preceding -Achse. In allen diesen Fällen, wenn das Attribut from verwendet wird, sind die einzigen Vorfahren die untersucht werden, die Nachfahren des nächsten Vorfahren, der dem from -Attribut entspricht. Anders ausgedrückt: mit from= " h1 " werden beim Zählen nur die Knoten berücksichtigt, die unter dem nächsten < h1 > -Attribut erscheinen. from Das Attribut from ist ein XPath-Ausdruck, der definiert, wo die Zählung beginnt. Sie können mit Hilfe des Attributs from etwa festlegen, dass die Zählung beim vorigen < h1 > -Element beginnen soll. value Ein Ausdruck, der in eine Zahl konvertiert wird. Die Anwendung dieses Attributs ist eine schnelle Methode, um eine Zahl zu formatieren, das Element < xsl:number value= " 7 " format= " i: " / > gibt den folgenden String zurück: " vii: " . format Das Attribut format definiert das Format der generierten Zahl: format= " 1 " Formatiert eine Sequenz an Zahlen als 1 2 3 4 5 6 7 8 9 10 11 ... . format= " 01 " Formatiert eine Sequenz an Zahlen als 01 02 03 04 ... 09 10 11 ... 99 100 101 ... . format= " a " Formatiert eine Sequenz an Zahlen als a b c d e f ... x y z aa ab ac ... . format= " A " Formatiert eine Sequenz an Zahlen als A B C D E F ... X Y Z AA AB AC ... . format= " i " Formatiert eine Sequenz an Zahlen als i ii iii iv v vi vii viii ix x ... . format= " I " Formatiert eine Sequenz an Zahlen als I II III IV V VI VII VIII IX X ... . format= " anything else " Wie das funktioniert, hängt vom verwendeten XSLT-Prozessor ab. Die XSLT-Spezifikation listet mehrere weitere Nummerierungsschemata auf (thailändische Ziffern, Katakana-Nummerierung, traditionelle hebräische Nummerierung, usw.). Lesen Sie in der Dokumentation Ihres XSLT-Prozessors nach, welche Formate er unterstützt. Falls ein XSLT-Prozessor das angeforderte Nummerierungsschema nicht unterstützt, schreibt die XSLT-Spezifikation vor, dass das format= " 1 " als Standardformat verwendet wird. lang Das Attribut lang definiert die Sprache, dessen Alphabet verwendet werden soll. Verschiedene XSLT-Prozessors unterstützen verschiedene Sprachwerte, lesen Sie daher die Dokumentation des XSLT-Prozessors, den Sie verwenden wollen. letter-value Dieses Attribut hat den Wert alphabetic oder traditional . Es gibt eine Reihe von Sprachen, in denen Nummerierungsschemata verwendet werden, die auf zwei Buchstaben basieren: der eine weist numerische Werte in alphabetischer Reihenfolge zu, während der andere eine für diese Sprache spezifische Tradition verwendet. (Römische Ziffern – ein Buchstaben-gestütztes Nummerierungsschema, das keine alphabetische Reihenfolge verwendet – sind ein Beispiel dafür.) Der Standardwert für dieses Attribut lautet alphabetic . grouping-separator Dieses Attribut ist das Zeichen, das zwischen den Zifferngruppen in einer generierten Nummer verwendet werden soll. Der Standardwert ist ein Komma ( , ). grouping-size Dieses Attribut definiert die Anzahl an Ziffern, die in jeder Gruppe erscheinen. Der Standardwert ist 3 .
Inhalt
Keiner. <xsl:number> ist ein leeres Element.
Übergeordnetes Element
<xsl:number> erscheint innerhalb einer Vorlage.
Definition
XSLT-Abschnitt 7.7, Nummerieren.
Beispiel
Um die ganze Funktionsweise von <xsl:number> zu veranschaulichen, wird ein XML-Dokument benötigt, das viele Teile enthält, die gezählt werden können. Es wird das folgende Dokument verwendet:
    <?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>
Die Anweisung <xsl:number> wird auf verschiedene Arten verwendet, um die verschiedenen Möglichkeiten der Nummerierung zu veranschaulichen. Zunächst sollen das Stylesheet und die Ergebnisse betrachtet werden, dann folgt die Erläuterung. Hier das Stylesheet:
    <?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>
Und hier die Ergebnisse:
    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"?
In Test 1, wurde level="multiple" verwendet, um die Elemente <chapter>, <sect1>, <sect2> und <sect3> zu zählen. Diese auf mehreren Ebenen zu nummerieren, ergibt für jedes Element eine Ziffer mit einem Punkt dahinter. Die Ziffer vor Studebaker beispielsweise bezeichnet das zweite <sect3>-Element innerhalb des vierten <sect2>-Elements innerhalb des ersten <sect1>-Elements innerhalb des zweiten <chapter>-Elements. Test 2 verwendet level="any", um alle <chapter>-, <sect1>-, <sect2>- und <sect3>-Elemente in ihrer Reihenfolge zu zählen. Test 3 verwendet level="single", um die Elemente auf der jeweiligen Ebene zu zählen. Das bedeutet, dass das vierte <sect3>-Element innerhalb eines bestimmten <sect2>-Elements mit einer 4 nummeriert wird (oder mit iv oder D oder dem sonst relevanten Format). Beachten Sie, dass die für jedes Element verwendete Zahl identisch ist mit der letzten Ziffer zu jedem Element in Test 1. Test 4 macht mehrere Dinge unterschiedlich: Zunächst werden als Nummerierungsstile Großbuchstaben und römische Zahlen in Kleinbuchstaben verwendet. Als Zweites werden Element auf mehreren Ebenen gezählt (für die Elemente <chapter>, <sect1> und <sect2>), doch werden nur die <sect2>-Elemente verarbeitet. Obwohl nur der title-Text des <sect2>-Elements ausgegeben wird, kann die Nummer der richtigen Ebene erzeugt werden. Test 5 erzeugt ähnliche Zahlen wie in Test 4, verwendet aber das Attribut from. Die Zahlen für die <sect3>-Elemente werden in vier Stadien erstellt: Zunächst werden die <chapter>-Vorfahren gezählt, beginnend beim ersten <book>-Vorfahren, dann werden die <sect1>-Vorfahren gezählt, beginnend bei dem ersten <chapter>-Vorfahren, usw. Test 6 beginnt die Zählung bei 1000 anstelle von 1. Dazu muss der von <xsl:number> erzeugte Wert in einer Variable gespeichert werden und anschließend der Wert der Variable plus 1000 ausgegeben werden. Beachten Sie, dass im value-Attribut des <xsl:number>-Elements ein Ausdruck verwendet werden kann. Zudem wurde das Attribut grouping-separator verwendet, um die dreiziffrigen Gruppen durch Kommata abzutrennen. In einem Deutschen Text hätte man auf dieselbe Weise anstelle des Kommas den Punkt als Tausendertrennzeichen definiert. In Test 7 schließlich werden nur Elemente aus dem ersten und zweiten <sect1>-Element (<sect1>-Elemente, deren position() kleiner als 3 ist) im zweiten <chapter>-Element nummeriert. Obwohl nur diese Abschnitte verarbeitet werden, können mit Hilfe von <xsl:number> die richtigen Nummern für die Elemente erzeugt werden.