<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 | |
|
|
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. |