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