Zu den am häufigsten verwendeten XSLT-Elementen dürfte xsl:number gehören, das Inhaltsverzeichnisse et cetera mit einer formatierten Nummerierung versieht (deswegen erhält sie einen eigenen winzigen Abschnitt ...). Das Element verfügt über mehrere Attribute, die die Art der Formatierung beeinflussen.
Für ein Buch wie das vorliegende ein Inhaltsverzeichnis zu erstellen, erleichtert xsl:number durchaus. Denn anders als in Romanen soll es neben dem Index eine Art Nachschlagen möglich machen. Die beiden folgenden Templates sind der Spezifikation entlehnt und auf unsere Buch-DTD übertragen.
<xsl:template match="ueberschrift"> <xsl:number level="multiple" count="kapitel|abschnitt|unterabschnitt" format="1.1.1 "/> <xsl:apply-templates/> </xsl:template> <xsl:template match="anhang//ueberschrift" priority="1"> <xsl:number level="multiple" count="anhang|glossar|bibliographie" format="A.1.1 "/> <xsl:apply-templates/> </xsl:template>
Beide Templates berücksichtigen das gesamte
Dokument. Die erste Schablone zählt die Kapitel und die
darin enthaltenen Abschnitte in drei Stufen, während die
zweite den Anhangteil verarbeitet. Der Unterschied liegt
vor allem im Attribut format, das die Kapitel
mit Ziffern, den Anhang aber mit Buchstaben
bezeichnet. Und ein Vergleich mit dem Listenbeispiel oben
zeigt, dass dort level implizit den Wert
single
hatte (Default) und nur die einzelnen Punkte
zählte, während hier die Struktur berücksichtigt wird.
level kann die Werte
single, multiple oder any
haben. single (das ist der Default-Wert) heißt,
dass die Zählung beim ersthöheren Element in der
ancestor-or-self-Hierarchie beginnt. Existiert
das nicht, ist das Resultat die leere ListeNoch
ein XSLT-Bashing: Wenn
leere Liste
nicht
nach Lisp klingt .... Abhängig ist
level auch von zwei anderen Attributen:
count und from (siehe unten).
<!-- XML-Eingabe --> <meine-elemente> <meinelement>daserste</meinelement> <meinelement>daszweite</meinelement> <meinelement>dasdritte</meinelement> <meinelement>dasvierte</meinelement> </meine-elemente> <!-- XSLT-Template --> <xsl:template match="meine-elemente"> <p> <xsl:for-each select="meinelement"> <xsl:number value="position()" format="i. "/> <xsl:apply-templates/><br/> </xsl:for-each> <p> </xsl:template> <xsl:template match="meinelement"> <xsl:value-of select="."/>< </xsl:template> <!-- HTML-Ausgabe --> <p>i. daserste<br/> ii. daszweite<br/> iii. dasdritte<br/> iv. dasvierte<br/> </p>
Im xsl:number-Statement des Template steckt das level="single" implizit mit drin, weil es ja der Default-Wert ist.
Das Attribut level legt fest, wo in der Hierarchie der Elemente das Stylesheet anfängt, diese für eine Zählung zu berücksichtigen. Hat es den Wert multiple, beginnt die Zählung ganz oben in der Hierarchie der Ahnen. Auch hier spielen die beiden anderen Attribute count und from eine Rolle, wie die Beispiele oben zeigen.
Im Falle von any als Wert von
level berücksichtigt das Stylesheet prinzipiell
alle vor
dem gegenwärtigen Element existierenden
Elemente und es selbst (zur Erinnerung: vor
heißt
auch hier: die Elemente, die bei einer Tiefensuche vor dem
gegenwärtigen liegen).
from schränkt den
Bereich des Suchbaums ein, innerhalb dessen gezählt wird. Im
folgenden Beispiel etwa bekommt jede kleine Überschrift
(h3) eine Nummerierung von 1.1
, indem die
größeren Überschriften (h2) und die kleineren
gezählt werden.
<xsl:template match="h3"> <xsl:number level="any" from="h1" count="h2"/> <xsl:text>.</xsl:text> <xsl:number level="any" from="h2" count="h3"/> <xsl:text>.</xsl:text> <xsl:apply-templates/> </xsl:template>
count benennt, wie in obigem Beispiel zu sehen, die zu zählenden Elemente.
Mit format bezeichnet
ein Autor, wie er etwas beziffern will. Dabei dienen
alphanumerische Zeichen der Benennung (etwa 1
und
a
in 1.1
oder 1.a
), während andere
Zeichen (hier der Punkt) so wiedergegeben werden, wie sie im
format-String stehen. Die wesentlichen Formate
sind 1, a, A, i, I. Taucht eins von ihnen im
Attribut auf, beginnt damit die Zählweise, und entsprechend
dem ersten Zeichen folgen andere. Dem a folgen
b, c, d, e.... Analoges gilt für den
Großbuchstaben. Beim i/I wird, ob groß oder
klein, römisch gezählt.
Die Attribute lang, letter-value, grouping-separator und grouping-size dienen der sprachübergreifenden Definition. Schon zwischen dem Englischen und Deutschen existieren Unterschiede, wie große Zahlen zu schreiben sind: 300 000 mit einem Leerschritt jeweils vor drei Ziffern oder wie im Englischen üblich, druch Kommata getrennt: 300,000. In anderen Sprachen mag das Alphabet eine andere Reihenfolge haben als die uns geläufige. Zwei Beispiele aus der Spezifikation: format="๑" bezeichnet die thailändische Ziffernfolge, während format="а" letter-value="traditional" eine alte slawische Zählweise repräsentiert. Die deutschsprachige Ausgabe erreicht das folgende Listing.
<xsl:number grouping-separator=" " grouping-size="3"/>