xsl:number

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 6.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

 

Die Instruktion xsl:number wird eingesetzt, um dem jeweiligen Kontextknoten bzw. (ab XSLT 2.0) einem durch das select-Attribut bestimmten Knoten eine in der Dokumentreihenfolge fortlaufende Bezifferung hinzuzufügen, die dessen hierarchischer Position im Dokument entspricht. Alternativ kann die Instruktion verwendet werden, um eine über ihr value-Attribut vorgegebene Zahl zur Ausgabe ins Ergebnisdokument zu formatieren. Erzeugt wird stets ein Textknoten.

Klassifizierung Instruktion
Funktionsgruppe Erzeugen von Output im Ergebnisdokument
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

xsl:number tritt als Instruktion innerhalb von Sequenzkonstruktoren auf. Das Element ist stets leer.

Attribute:

Es gelten die üblichen Standardattribute. Zusätzlich besitzt die Instruktion xsl:number eine Anzahl optionaler Attributen, welche die zu zählenden Elemente bestimmen (count), ihren Zählwert (value), die Nummerierungshierarchie und die Zähltiefe festlegen (level, from) sowie die Formatierung des Nummerierungsstrings für das Ausgabedokument vornehmen (format, grouping-separator, grouping-size, lang, letter-value). Gegenüber XSLT 1.0 sind in XSLT 2.0 die optionalen Attribute select und ordinal hinzugekommen.

Die Instruktion kann allerdings auch vollkommen ohne Attribute eingesetzt werden. In diesem Fall greifen die entsprechenden Defaultwerte.

count

Wert

xpath-pattern

Verwendung

Optional

Einführung

XSLT 1.0

Das count-Attribut enthält ein XPath-Pattern, das – absolut oder ausgehend vom aktuellen bzw. dem durch das select-Attribut bestimmten Knoten – das zu zählende Element bezeichnet.

Ist kein count-Attribut vorhanden, so bezieht sich die Nummerierung per Default auf Knoten vom gleichen Typ wie der aktuelle, bzw.der durch select bezeichnete Knoten.

format

Wert

{string} (auch als AVT)

Verwendung

Optional

Einführung

XSLT 1.0

Das format-Attribut beschreibt die Formatierung des auszugebenden Nummerierungsstrings. Es dürfen Zahlen und Buchstaben sowie Separatorzeichen eingesetzt werden, um eine Bezifferung durch Zahlen, Buchstaben, römischen Ziffern oder Zahlworten zu definieren. Ebenfalls möglich ist eine Nummerierung mit Ordnungszahlen (ordinal numbering).

Beispielhafte Formatstrings und ihre Bezifferungen/Nummerierungen:

format="a)" ergibt eine Bezifferung mit Kleinbuchstaben, gefolgt von einer runden Klammer: a), b), c) ...

format="i." eine römische Bezifferung: i., ii., iii. ...

format="1.a" eine hierarchische Bezifferung mit Zahlen und Kleinbuchstaben: 1.a, 1.b, 2.a ... etc. (weitere Nummerierungsreihen siehe folgende Tabelle).

Der Formatstring format="1st" ergibt die Nummerierung 1st, 2nd, 3rd, 4th etc., der Formatstring format="first" entsprechend first, second, third. Derzeit wird lediglich eine Implementierung in englischer Sprache gefordert. Alternativ kann (ab XSLT 2.0) das ordinal-Attribut verwendet werden.

Defaultwert ist "1", d.h. ohne format-Attribut gibt xsl:number einfache Zahlen aus. Der Formatstring darf zur Laufzeit aus einem Attributwert-Template bestimmt werden.

from

Wert

xpath-pattern

Verwendung

Optional

Einführung

XSLT 1.0

Das from-Attribut bezeichnet denjenigen Knoten im Dokument, der als Startpunkt für den Zählvorgang dient. Ausgehend vom Current Node wird der erste Knoten entgegen der Dokumentreihenfolge gewählt, auf den das Pattern passt. Der Startknoten und seine Vorgänger werden beim Zählvorgang nicht berücksichtigt.

Per Default ist der Zählvorgang nicht eingeschränkt, was einem Pattern gleichgesetzt werden kann, das auf keinen Node passt (etwa: "*[false()]").

grouping-separator

Wert

{char} (auch als AVT)

Verwendung

Optional

Einführung

XSLT 1.0

Das grouping-separator-Attribut muss zusammen mit dem grouping-size-Attribut verwendet werden und bestimmt ein Zeichen, das als Trennsymbol bei der Untergliederung längerer Zahlen in Zifferngruppen dient. Normalerweise wird an dieser Stelle der Punkt verwendet, im anglo-amerikanischen Sprachraum das Komma.

Hinweis: Wird nicht gleichzeitig die Größe der Gruppe im grouping-size-Attribut bestimmt, so wird das Attribut ignoriert. Das zu verwendende Zeichen kann durch ein Attributwert-Template bestimmt werden.

grouping-size

Wert

{number} (auch als AVT)

Verwendung

Optional

Einführung

XSLT 1.0

Das grouping-size-Attribut bestimmt die Größe der Gruppen bei der Untergliederung längerer Zahlen. Der Wert muss entweder eine Ganzzahl sein oder wird als Attributwert-Template übergeben, das eine Ganzzahl ergibt. Der gebräuchlichste Fall ist die Gruppierung in Dreiergruppen.

Hinweis: Das Attribut wird ignoriert, wenn nicht gleichzeitig ein grouping-separator-Attribut vorhanden ist.

lang

Wert

{nmtoken} (auch als AVT)

Verwendung

Optional

Einführung

XSLT 1.0

Das lang-Attribut wird eingesetzt, um eine Sprache zu festzulegen, deren Konventionen in Bezug auf den Nummerierungsstring befolgt werden sollen. Die Sprache wird (nach RFC 1766) durch einen aus zwei Buchstaben bestehenden Ländercode gemäß ISO 639 repräsentiert.

Alternativ kann ein Code gemäß der »Internet Assigned Numbers Authority« (IANA) gewählt werden, dann mit Präfix »i-« vor dem eigentlichen Code. Auch nutzerdefinierte Codes sind möglich, die dann das Präfix »x-« erhalten, um als solche gekennzeichnet zu sein.

Das Buchstabenkürzel kann – beispielsweise für eine atomatische Lokalisierung des Stylesheets – durch ein Attributwert-Template erzeugt werden. Als Defaultsprache wird die der Systemumgebung verwendet.

letter-value

Wert

{"alphabetic" | "traditional"} (auch als AVT)

Verwendung

Optional

Einführung

XSLT 1.0

Das letter-value-Attribut wird dann benötigt, wenn die Nennung des Startsymbols einer Nummerierungssequenz allein nicht ausreicht, um den weiteren Verlauf der Sequenz sicher zu bestimmen. Als Werte sind die Begriffe "alphabetic" und "traditional" gestattet, die auch über ein AVT übergeben werden dürfen. Defaultwert ist "alphabetic".

Ein anschauliches Beispiel für die Verwendung dieses Attributs ist das Hebräische, bei dem das Alphabet sowohl in der traditionellen als auch in der zeitgenössischen Version mit dem Buchstaben Aleph א beginnt, anschließend jedoch abweichende Buchstabenfolgen aufweist.

level

Wert

"single" | "multiple" | "any"

Verwendung

Optional

Einführung

XSLT 1.0

Das level-Attribut bestimmt die Zähltiefe in Bezug auf die Dokumenthierarchie. Es kann nur wahlweise einen der drei Werte single, multiple und any annehmen. Defaultwert ist "single".

Gezählt werden alle Knoten, auf die das XPath-Pattern des count-Attributs passt, oder – falls kein count-Attribut vorgegeben wurde – jene, die dem aktuellen Knoten vom Namen und Knotentyp entsprechen. Der Wert eines eventuell vorhandenen from-Attributs wird berücksichtigt, um den Startpunkt des Zählvorgangs zu bestimmen.

level="single"
Der Defaultwert "single" bedeutet, dass alle Knoten auf der Preceding-Sibling-Achse gezählt werden. Er tritt auch in Kraft, wenn das Attribut weggelassen wird. Der Current Node wird mitgezählt, d.h., falls dieser drei zu zählende Vorgängerknoten besitzt, bekommt er selbst die Zahl vier.

level="multiple"
Dieser Level versetzt xsl:number in die Lage, mehrere Knotentypen oder Elemente, die sich auf verschiedenen Ebenen befinden (z.B. Kapitel, Überschriften, Abschnitte), gleichzeitig zu zählen und auf diesem Wege eine hierarchisch gestaffelte Nummerierung (z.B. A.1.a) zu erzeugen.

In Zusammenhang mit dem count- und dem format-Attribut können beinahe beliebige Strukturen erzielt werden. Es wird hierfür zunächst eine Liste aller Vorfahren erstellt, und dann werden jeweils die Preceding-Siblings all derjenigen Knoten gezählt, auf die das count-Pattern passt. Die so erstellte hierarchische Nummerierung wird gemäß des Strings des format-Attributs vorgenommen.

level="any"
Der Attributwert level="any" weist die Instruktion an, entgegen der Dokumentreihenfolge ausgehend vom Current Node nach allen Knoten zu suchen, auf die das count-Pattern passt, unabhängig von ihrer Stellung in der Dokumenthierarchie. Dieser Zählvorgang endet gegebenenfalls an einem durch das from-Attribut bezeichneten Startknoten. Der Current Node wird mitgezählt, falls das count-Pattern auf ihn passt.

ordinal

Wert

{string} (auch als AVT)

Verwendung

Optional

Einführung

XSLT 2.0

Das ordinal-Attribut dient dazu, die Nummerierung in Ordinalform anzuordnen (1st, 2nd, 3rd ... oder vergleichbar). Die Form der ausgegebenen Nummerierung ist sprachabhängig und wird zusätzlich mittels des format-Attributs näher bestimmt.

Hinweis: Das ordinal-Attribut existiert nicht in XSLT 1.0.

select

Wert

xpath-expression

Verwendung

Optional

Einführung

XSLT 2.0

Mit Hilfe des select-Attributs wird der Knoten, auf den sich die Instruktion beziehen soll, unmittelbar bezeichnet. Wird durch den Ausdruck mehr als ein Knoten gewählt, so wird ein Fehler gemeldet (ERR XTTE1000).

Ist kein select-Attribut vorhanden, so bezieht sich xsl:number auf den Kontextknoten (als Defaultwert kann also select="." gelten). Handelt es sich dann bei dem Kontextitem jedoch nicht um einen Knoten und ist auch kein value-Attribut gesetzt, so wird ein Typfehler gemeldet (ERR XTTE0990).

Hinweis: Das select-Attribut existiert nicht in XSLT 1.0.

value

Wert

xpath-expression

Verwendung

Optional

Einführung

XSLT 1.0

Das value-Attribut enthält einen XPath-Ausdruck, der zu einer Ganzzahl ausgewertet und als Nummerierungsstring verwendet wird. Ist gleichzeitig ein format-Attribut vorhanden, so wird dieser für die Ausgabe entsprechend formatiert. Der Wert 0 ist für value ausdrücklich gestattet.

Ohne value-Attribut erstellt xsl:number eine Bezifferung auf Grundlage der Position des nummerierten Elements im Elementbaum (also anhand der Dokumentreihenfolge). Hierbei werden eventuelle level- und from-Attribute berücksichtigt.

Hinweis: Wird das value-Attribut eingesetzt, so dürfen weder level- noch count-, select- oder from-Attribut erscheinen. Der Verstoß gegen diese Regel ist ein statischer Fehler (ERR XTSE0975). Ebenso ist es ein Fehler, wenn der Ausdruck keine Ganzzahl xs:integer ergibt, oder die Auswertung einen Wert kleiner 0 ergibt (ERR XTDE0980).

Verwendungszweck:

Die Anweisung xsl:number gibt im einfachen Fall eine Ganzzahl zurück, die die Position des Kontextknotens in der Hierarchieebene des Dokuments in Bezug auf Geschwisterelemente des gleichen Namens bezeichnet (siehe Beispiel 1). Mit Hilfe des level-Attributs kann auch übergreifend über mehrere Hierarchieebenen gezählt werden (Beispiele 4 und 5), wobei das from-Attribut einen Startpunkt für den Zählvorgang festlegen kann.

Alternativ kann anstelle der Ableitung der Bezifferung von der Position des Knotens mittels des value-Attributs eine hiervon unabhängige erzwungen werden. Dies ist insbesondere bei der Ausgabe von sortierten, also in der Nodesequenz nicht mehr in Dokumentreihenfolge vorliegenden Elementen wichtig.

In diesem Zusammenhang findet die XPath-Funktion fn:position() Verwendung (siehe Beispiel 2). Mittels des format-Attributs von xsl:number kann deren, ansonsten nur als Ganzzahl vorliegender, Rückgabewert in jede beliebige Form gebracht werden. Eine Alternative bestünde in der Verwendung von fn:position() in Verbindung mit format-number() und einer xsl:decimal-format-Definition.

Der Formatierungsstring:
Mit dem format-Attribut können die Nummerierungssymbole und die Trennzeichen bestimmt werden. Defaultwert sind (arabische) Zahlen als Bezifferung und keine Trennzeichen.

Lässt man das format-Attribut weg, so steht die Nummerierung unmittelbar vor dem Inhalt – Leerraum sollte dann mit xsl:text eingefügt werden. Ansonsten zählen Leerzeichen im Formatierungsstring zu den relevanten Zeichen.

In der folgenden Tabelle ist die Wirkung verschiedener Werte des format-Attributs dargestellt – die Fettmarkierungen in der Spalte »Wirkung« dienen nur zur Verdeutlichung:

format-Attributwert Wirkung

(ohne format-Attribut)

1Listenelement

format=" "

1 Listenelement

format="."

1.Listenelement

format=". "

1. Listenelement

format="001. "

001. Listenelement

format="a "

a Listenelement

format="A: "

A: Listenelement

format="i) "

i) Listenelement (römisch, klein)

format="I "

I Listenelement (römisch, groß)

format="w"

one Listenelement
(weiter: two, three, four)

format="W"

ONE Listenelement
(weiter: TWO, THREE ...)

format="Ww"

One Listenelement
(weiter: Two, Three ...)

format="a#: "

a#: Listenelement

Tabelle: Wirkung des format-Attributs.

Hinweis: Die tatsächlich erfolgende Ausgabe für die Formatstrings »w«, »W« und »Ww« ist abhängig von der aktuellen Spracheinstellung.

Nummerierungssymbole formal betrachtet:
Grundsätzlich wird im format-Attribut das erste Zeichen genannt, das eine zur Formatierung zu verwendende Reihe (Nummerierungssequenz) bestimmt – im einfachsten Fall ist dies die Ziffer 1 (der Defaultwert) oder einer der Buchstaben a, A, i oder I.

Genauso ist es jedoch möglich, hebräische, griechische oder japanische (Katakana) Zeichen als Symbole zu verwenden. In diesem Fall wird das als Startpunkt »Eins« zu betrachtende Zeichen als Unicode Character Entity übergeben.

Startzeichen Nummerierung

a

Kleinbuchstaben, westliches Alphabet

A

Großbuchstaben, westliches Alphabet

i

Römische Bezifferung, Kleinbuchstaben

I

Römische Bezifferung, Großbuchstaben

א

Hebräisch, alphabetisch/traditionell*

ა

Georgisch, alphabetisch/traditionell*

α

Griechisch, alphabetisch/traditionell*

䀰

Altslawisch, alphabetisch/traditionell*

ア

Japanisch (Katakana)

イ

Japanisch (Katakana, Iroha Variante)

๑

Thai

(Anmerkung: * für diese Reihe ist zusätzlich das letter-value-Attribut anwendbar.)

Tabelle: Startzeichen für verschiedene Nummerierungen.

Nummerierung mit Ziffern:
In einfachen Fällen werden Ziffern zur Num­merierung eingesetzt. Dies ergibt als Nummerierung beispielsweise:

  • Ohne format-Attribut die Folge »1«, »2«, »3«, »4« etc.
  • Vor Ziffern können im Formatierungsstring (Format-Token) eine oder mehrere führende Nullen stehen, die in die Ausgabe übernommen werden und bei Bedarf durch die entsprechenden Ziffern ersetzt werden.

  • Für das Format-Token "01" die Folge »01«, »02« ...“09«, »10« etc.

  • Für das Format-Token "001" die Folge »001«, »002« ... »099«, »100« etc.
  • Zusätzlich kann das ordinal-Attribut verwendet werden, um die Ausgabe einer Ordinalbezifferung (Ordnungszahlen) anzuordnen. Der Attributwert muss zunächst einfach ein nicht-leerer String sein, um die anglo-amerikanischen Ordinalendungen hinzuzufügen (der hier übergebene Wert "yes" ist für die Ausgabe also im Grunde irrelevant):

  • format="1" ordinal="yes" ergibt die Folge »1st«, »2nd«, »3rd« ...
  • Alternativ kann eine andere Endung für das Ordinal festgelegt werden, was durch einen vor diese gestellten Bindestrich gekennzeichnet wird:

  • format="1" lang="it" ordinal="-º" ergibt die Folge »1º«, »2º«, »3º« ...
  • Hinweis: Lässt sich eine Ordinalanweisung nicht ausführen, so wird sie ignoriert und stattdessen eine Kardinalnummerierung vorgenommen.

Nummerierung mit Buchstaben:
Anstelle von Ziffern kann eine Nummerie­rung mit alphabetisch fortlaufenden Buchstaben vorgenommen werden. Ver­wendet man den Anfangsbuchstaben eines bestimmten Alphabets, so wird eine entsprechende Folge erzeugt.

  • Für das Token "a" die Folge »a«, »b«, »c« etc.
  • Nach »z« wird mit»aa«, »ab« etc. weitergezählt, analog in Großbuchstaben für das Token "A".
  • Die römische Bezifferung wird als »i«, »ii«, »iii«, »iv«, »v« etc. umgesetzt.

Nummerierung mit Zahlworten:
Zahlwortreihen können in Groß- oder Kleinbuchstaben erzeugt werden. Die entstehenden Folgen sind (abhängig vom Wert des lang-Attributs):

  • Für das Token "w" entsprechend »one«, »two«, »three«, »four« ...
  • Für das Token "W" entsprechend »ONE«, »TWO«, »THREE«, »FOUR« ...

  • Für das Token "Ww" eine mit Großbuchstaben beginnende Folge »One«, »Two«, »Three« ...
  • Über das lang-Attribut kann auch eine Zahlwortfolge in anderen Sprachen bestimmt werden (z.B. für lang="de" ergibt format="w" die Folge »eins«, »zwei«, »drei« ...).

    Zusätzlich kann hier das ordinal-Attribut eingesetzt werden:

  • Für format="w" lang="de" ordinal="-e" ergibt sich die Folge »erste«, »zweite«, »dritte« ...
  • Für format="w" lang="de" ordinal="-er" ergibt sich die Folge »erster«, »zweiter«, »dritter« ...
  • Für format="W" lang="it" ordinal="-o" ergibt sich »Primero«, »Secundo«, »Terzo«, »Quarto« ...

Zusätzliche Zeichen im Formatierungsstring:
Das gewählte Nummerie­rungszeichen kann im Outputstring von weiteren Zeichen umgeben sein. Zusätzlich oder alternativ zu einem einfachen Punkt oder einem Leerzeichen können vor oder nach dem eigentlichen Nummerierungssymbol beliebige wei­tere Interpunktionszeichen verwendet werden.

Durch entsprechende Beifügungen (und gegebenenfalls hierarchische Numme­rierung) können Outputstrings in der Form IV – (1), A [iii], 2a.:, 1.2.a) etc. erzielt werden. Unmittelbar in diesem Kontext verwendbar sind folgende Zeichen:

. , ; : _ – ! ? $ % [ ] = ( ) # ' + * ~

Als Entities bzw. mit Characterentities umschrieben sind weitere Sonderzeichen möglich, wie:

  • & durch &
  • < durch &lt;
  • > durch &gt;
  • § durch &#167;

Die geschweifte Klammer kann ebenfalls verwendet werden, muss in diesem Fall aber durch Verdoppelung maskiert werden (anstelle von { muss also {{ stehen). Der Grund ist, dass das format-Attribut die Verwendung von Attributwert-Templates zulässt, die geschweifte Klammer in diesem Zusammenhang daher ein Steuerzei­chen darstellt.

Beispiele:

Beispiel 1 – Erzeugung einer nummerierten Liste:

Stylesheet:

<xsl:template match="liste">
  <p>
    <xsl:for-each select="listenelement">
      <xsl:number/>
      <xsl:text> </xsl:text>
      <xsl:value-of select="."/><br/>
    </xsl:for-each>
  </p>
</xsl:template>

Ausgabe:

<p>1 Listenwert<br> 2 Listenwert<br> 3 Listenwert<br> ...</p>

Die Kindelemente <listenelement> eines Elements <liste> werden durch xsl:number jeweils bei 1 beginnend in Quelltextreihenfolge nummeriert. xsl:number erzeugt dabei nur einfache Ziffern ohne weitere Formatierung. Durch xsl:text muss daher ein Leerzeichen zwischen der Nummerierung und der Ausgabe des Stringwerts des Listenelements erzwungen werden.

Beispiel 2 – Erzeugung einer sortierten nummerierten Liste:

Stylesheet:

<xsl:template match="liste">
  <p>
    <xsl:for-each select="listenelement">
      <xsl:sort select="."/>
      <xsl:number value="position()" format="1. "/>
      <xsl:value-of select="."/><br/>
    </xsl:for-each>
  </p>
</xsl:template>

Ausgabe:

<p>1. Listenwert<br> 2. Listenwert<br> 3. Listenwert<br> ...</p>

Die Sortierung der Listenelemente nach Stringwert mit xsl:sort erfordert den Einsatz des Attributs value in xsl:number, um anstelle der Position im Dokument die Position in der sortierten Knotenliste auszugeben. Andernfalls würden die Knoten trotz Sortierung in Dokumentreihenfolge nummeriert, was in der Regel nicht der Sortierung entsprechen wird. Die Verwendung des format-Attributs definiert die zusätzliche Ausgabe eines Aufzählungspunktes und eines trennenden Leerzeichens. Die Bezifferung könnte ebenso mit Buchstaben oder römischen Ziffern erfolgen.

Beispiel 3 – Mit dem count-Attribut Vorgängerelemente zählen:

Quelldokument (Ausschnitt):

<buch>
  <kapitel>
    <titel>Überschrift</titel>
    ...
  </kapitel>
  <kapitel>
    <titel>Überschrift</titel>
    ...
  </kapitel>
  <kapitel>
    <titel>Überschrift</titel>
    ...
  </kapitel>
  ...
</buch>

Stylesheet (Ausschnitt):

<xsl:template match="kapitel/titel">
  <h1>
    <xsl:number count="kapitel"/>
    <xsl:apply-templates/>
  </h1>
</xsl:template>

Ergebnisdokument (Ausschnitt):

...
<h1>1 Überschrift</h1>
... bla ...
<h1>2 Überschrift</h1>
... bla ...

Die Nummerierung der Überschriften soll im Titeltemplate erfolgen: gezählt werden muss jedoch das übergeordnete <kapitel>-Element. Hierfür wird das count-Attribut eingesetzt.

Beispiel 4 – Mit level="any" überall im Dokument zählen:

Stylesheet (Ausschnitt):

<xsl:template match="bild">
  <!-- Bild darstellen, wie auch immer -->
  <xsl:text>Abb. </xsl:text>
  <xsl:number level="any"/>
  <xsl:text>:</xsl:text>
  <!-- Bildunterschrift erzeugen -->
</xsl:template>

Da das <bild>-Element Current Node ist, muss kein count-Attribut gesetzt werden. Durch level="any" werden alle Bilder gezählt, die vor dem aktuellen Bild im Dokument aufgetreten sind.

Ergebnisdokument (Ausschnitt):

<p><img src="katze.gif">Abb. 57: die gemeine Hauskatze</p>

Bei level="single" oder nicht gesetztem level-Attribut stoppt der Prozessor beim ersten Vorgängerknoten, auf den das count-Pattern passt, und zählt des­sen Preceding-Siblings. Das Ergebnis ist nur dann korrekt, wenn sich die Ziel­knoten zuverlässig auf einer gemeinsamen Hierarchieebene befinden. Ist dies nicht sicher der Fall, wie z.B. bei Abbildungen, so muss das ganze Dokument entgegen der Dokumentreihenfolge ab dem Kontextknoten durchsucht wer­den, ohne dass der Prozessor in der Ebene stoppt, in der der erste count-Match auftritt. Um eben dies zu verhindern, setzt man das level-Attribut auf "any".

Beispiel 5 – Hierarchische Nummerierung mit level="multiple":

Das Quelldokument (Ausschnitt):

...
  <!-- die erste Liste -->
  <liste>
    <item>Erstes Element erste Liste</item>
    <item>Zweites Element erste Liste</item>
     ...
  </liste>
  <!-- die zweite Liste -->
  <liste>
    <item>Erstes Element zweite Liste</item>
    <item>Zweites Element zweite Liste</item>
    ...
  </liste>
  ...

Wird das level-Attribut auf den Wert "multiple" gesetzt, so ist eine komple­xere Art der Numerierung möglich. Sind zwei oder mehr Listen der Art »<liste> enthält <item>« im Dokument, so können gleichzeitig die Listen und deren enthaltene Items gezählt und den verschiedenen Ebenen der Hierarchie verschiedene Zählsymbole zugewiesen werden. Dazwischen steht die tren­nende Interpunktion.

Stylesheet (Ausschnitt):

<xsl:template match="liste/item">
  <div>
    <xsl:number level="multiple" count="liste | item" format="1. a) "/> 
    <xsl:apply-templates/>
  </div>
</xsl:template>

Das level-Attribut alleine genügt nicht. Erst in Zusammenhang mit dem count- und dem format-Attribut können nahezu beliebige Strukturen erzielt werden. Der Current Node während der Templateverarbeitung ist das <item>-Element, von dem aus auf die Ancestor-Achse zum <liste>-Element gegangen wird. Dieses selbst sowie dessen Preceding-Siblings (die der umgebenden Liste vorangegangenen Listen) werden dann gezählt, hierdurch wird der zweiten Liste die Zahl »2« vorangestellt. Gleichzeitig werden innerhalb der Liste die Preceding-Siblings des <item>-Elements selbst gezählt, da dieses ebenfalls auf das Zählpattern der xsl:number-Instruktion zutrifft.

Ergebnisdokument (Ausschnitt):

...
<div>1. a) Erstes Element erste Liste</div>
<div>1. b) Zweites Element erste Liste</div>
...
<div>2. a) Erstes Element zweite Liste</div>
<div>2. b) Zweites Element zweite Liste</div>
...

Die Hierarchie des Bezifferungsstrings in format folgt von links nach rechts der Dokumenthierarchie – das am weitesten rechts stehende Segment ist für das hierarchisch am tiefsten im Dokumentbaum befindliche Element zuständig (in der Regel der Current Node). Das count-Attribut nennt also lediglich die zu zählenden Elemente – die Reihenfolge, in der sie dort aufgeführt werden, spielt keine Rolle.

Elementdefinition:

XSLT 1.0:

<!-- Category: instruction -->
<xsl:number 
     value = number-expression
     level = "single" | "multiple" | "any"
     count = pattern 
     from = pattern 
     format = { string }
     lang = { nmtoken }
     letter-value = { "alphabetic" | "traditional" }
     grouping-separator = { char }
     grouping-size = { number } 
/>

XSLT 2.0:

<!-- Category: instruction -->
<xsl:number
     value? = expression
     select? = expression
     level? = "single" | "multiple" | "any"
     count? = pattern
     from? = pattern
     format? = { string }
     lang? = { nmtoken }
     letter-value? = { "alphabetic" | "traditional" }
     ordinal? = { string }
     grouping-separator? = { char }
     grouping-size? = { number } 
/>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn