xsl:template

(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 Deklaration xsl:template dient zur Definition einer Template-Regel bzw. eines benannten Templates. Mit Hilfe des in diesem Template enthaltenen Sequenzkonstruktors kann in Zusammenhang mit einem verarbeiteten Node ein beliebiger Output in einen Ergebnisbaum erzeugt werden.

Klassifizierung Deklaration
Funktionsgruppe Template-Regel eines XSLT-Stylesheets
Einführung XSLT 1.0

Position im Stylesheet und erlaubte Inhalte:

Die Deklaration xsl:template zählt zu den Toplevel-Elementen von XSL und tritt daher nur als unmittelbares Kindelement der Root-Elemente xsl:stylesheet oder xsl:transform auf.

Die Deklaration enthält einen optionalen Inhalt in Form eines Sequenzkonstruktors (in XSLT 1.0 als Templatebody bezeichnet). Alternativ kann das Element leer sein, wenn für den zu verarbeitenden Node ausdrücklich kein Output erwünscht ist (dies ist beispielsweise der Fall für die implizite Default-Template-Regel für Kommentarknoten).

Attribute:

Die Deklaration xsl:template besitzt eine Reihe von Attributen, von denen alternativ entweder match oder name obligatorisch vorkommen müssen, während mode und priority in Zusamenhang mit match optional sind. In XSLT 2.0 kommt ein ebenfalls optionales as-Attribut hinzu.

as

Wert

sequence-type

Verwendung

optional

Einführung

XSLT 2.0

Der Wert des as-Attributs ist eine Angabe in Form eines Sequenztyps gemäß XPath 2.0, mit der eine Aussage über Datentyp, Form und Inhalt der Ausgabesequenz der Template-Regel gemacht werden kann.

Der im as-Attribut genannte Typ wird als maßgeblich für den Typ des Ergebnisses des Sequence Constructors betrachtet. Die Ergebnissequenz wird entsprechend in den geforderten Typ konvertiert. Ist eine Konvertierung nicht möglich, so wird ein Typfehler gemeldet.

Ohne as-Attribut wird als Defaultwert für den Sequenztyp der Wert item()* angenommen, was eine Folge beliebiger Nodes und/oder atomarer Werte zulässt. Ein Konvertierung der Items ist dann nicht erforderlich und findet nicht statt.

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

match

Wert

xpath-pattern

Verwendung

obligatorisch oder optional

Einführung

XSLT 1.0

Das match-Attribut ist obligatorisch, sofern kein name-Attribut eingesetzt wird; andernfalls optional. Besitzt ein xsl:template-Element ein match-Attribut, so spricht man von einer Template-Regel.

Der Attributwert besteht aus einem XPath-Pattern, das dazu dient, diejenigen im Push-Verfahren (d.h. durch xsl:apply-templates) angebotenen Knoten zu identifizieren, die durch die Template-Regel verarbeitet werden sollen. Für XSLT 2.0 ist das Pattern in XPath 2.0 formuliert, für XSLT 1.0 in XPath 1.0

Passen mehrere Template-Regeln auf einen anstehenden Knoten, so wird diejenige mit der höchsten Priorität bzw. Importpräzedenz (siehe xsl:import) gewählt. Die Priorität bestimmt sich vorrangig aus dem Wert des priority-Attributs und, falls kein solches vorhanden ist, aus der Form des verwendeten XPath-Patterns (die Regeln hierzu finden Sie in der nachfolgenden Übersichtstabelle).

Hinweis: Besitzt ein xsl:template-Element kein match-Attribut, so muss es ein name-Attribut besitzen und darf weder ein priority- noch ein mode-Attribut besitzen. Ein Verstoß hiergegen gilt als Fehler (ERR XTSE0500).

mode

Wert

tokenliste (in XSLT 1.0: qname)

Verwendung

optional

Einführung

XSLT 1.0

Optional; nicht gestattet, wenn kein match-Attribut verwendet wird. Der Attributwert ist eine Tokenliste aus QNames, die einen Templatemodus bezeichnen, von denen einer beim Aufruf der Template-Regel der aktuelle Modus (current mode) sein muss.

Hinweis – In XSLT 1.0 keine Tokenliste für das mode-Attribut:
In XSLT 1.0 ist eine Tokenliste nicht gestattet – hier muss es sich um einen (einzigen) QName handeln, weshalb eine Template-Regel in XSLT 1.0 in maximal einem Templatemodus aufgerufen werden kann. Ein Platzhaltersymbol *, wie unten angesprochen, ist ebenfalls nicht erlaubt.

Eine Template-Regel mit mode-Attribut kann nur dann aktiviert werden, wenn die anstehende Knotenfolge im entsprechenden Modus verarbeitet werden soll, beim aufrufenden xsl:apply-templates also ein mode-Attribut mit identischem QName verwendet wurde.

Ein Aufruf ohne mode-Attribut kann folglich auch nur durch Template-Regeln ohne mode-Attribut verarbeitet werden. Man spricht dann vom (unbenannten) Defaultmodus.

In XSLT 2.0 besteht zudem die Möglichkeit, statt einer Tokenliste bzw. eines einzelnen QNames das Platzhaltersymbol * anzugeben. Die Template-Regel ist in diesem Fall, ungeachtet des beim Aufruf aktuellen Templatemodus, stets aktivierbar (populär ausgedrückt »passt« sie auf jeden Modus).

name

Wert

qname

Verwendung

optional

Einführung

XSLT 1.0

Obligatorisch, sofern kein match-Attribut verwendet ist; in jenem Fall optional. Der Attributwert muss ein QName sein, der in expandierter Form zur namentlichen Kennzeichnung des Element dient. (Besitzt der Bezeichner kein Präfix, so wird allerdings nicht der Default-Namensraum verwendet, sondern der Null-Namensraum!) Man spricht bei einem Template mit name-Attribut von einem »benannten Template«, nicht von einer »Template-Regel«.

Der Aufruf eines benannten Templates erfolgt ausschließlich über die Instruktion xsl:call-template. Eine Aktivierung über im Push-Verfahren anstehende Knotenlisten ist nicht möglich. Aus diesem Grund hat es weder Sinn noch ist es gestattet, für ein benanntes Template das priority- oder das mode-Attribut zu verwenden.

Hinweis: Die letzte Aussage ist nur dann richtig, wenn nicht gleichzeitig auch ein match-Attribut vorhanden ist, das Template also zusätzlich als Template-Regel verwendet wird.

priority

Wert

numeric

Verwendung

optional

Einführung

XSLT 1.0

Das Attribut ist grundsätzlich optional, allerdings verboten, wenn kein match-Attribut verwendet wird. Der Attributwert muss eine Zahl im Bereich von ±9 sein, die die Priorität der Template-Regel gegenüber Template-Regeln mit vergleichbarem match-Pattern festlegt.

Die natürliche Priorität (Defaultpriorität), wie sie sich aus dem Pattern ergibt, wird dabei überschrieben – unabhängig davon, ob sie höher oder niedriger als der angegebene Wert ist. Es ist daher auch möglich, mittels des priority-Attributs die Priorität einer Template-Regel künstlich zu drücken.

Die Defaultpriorität einer Template-Regel wird anhand des im match-Attribut verwendeten XPath-Pattern bestimmt und folgt dabei den Regeln in der weiter unten angeführten Tabelle.

Verwendungszweck:

Mit Hilfe der xsl:template-Deklaration werden die Template-Regeln und benannten Templates eines XSLT-Stylesheets definiert, die die Verarbeitung eines Eingabedokuments vornehmen, und aus deren Sequenzkonstruktoren bei der Instanziierung einzelner Templates der Ergebnisbaum aufgebaut wird.

Das Innere des Templates, der sogenannte Templaterumpf, setzt sich zusammen aus einer beliebigen Folge von XSLT-Instruktionen, literalen Ergebniselementen und Textknoten. Bei der Instanziierung des Templaterumpfes werden die enthaltenen Instruktionen ausgeführt und Literal Result Elements sowie Textknoten in den Ergebnisbaum kopiert.

Mittels der xsl:template-Deklaration sind Templates in zwei verschiedenen Ausprägungen realisierbar – benannte Templates und Template-Regeln.

Benannte Templates mit name-Attribut:
Ein Template kann mittels des name-Attributs einen Namen in Form eines qualifizierten Bezeichners erhalten. Dieser QName kann ein Präfix besitzen, das an einen Namensraum gebunden ist. In diesem Fall wird der expandierte QName verwendet.

Besitzt der QName kein Präfix, so ist er jedoch nicht im Default-Namensraum, der durch das xmlns-Pseudoattribut (z.B. im Stylesheet-Element) festgelegt wird, sondern in keinem Namensraum – der expandierte Bezeichner entspricht also dem lokalen Bezeichner.

Ein solcherart benanntes Template wird nicht durch eine anstehende Knotenliste aktiviert, sondern muss über xsl:call-template namentlich aufgerufen werden. Der Aufruf ist in diesem Sinne unabhängig von der aktuellen Template-Regel (diese wird beibehalten) und ist vergleichbar mit einer Subroutine.

Das benannte Template kann Parameter enthalten, die beim Aufruf durch xsl:call-template übergeben werden können (bzw. müssen, sofern sie mit dem Attribut required="yes" versehen sind). In XSLT 2.0 (noch nicht in XSLT 1.0) ist es allerdings ein Fehler, wenn hierbei ein Parameter adressiert wird, der im Zieltemplate nicht existiert.

Zwischen benannten Templates bestehen außer dem Namen keine Unterscheidungsmöglichkeiten – beispielsweise in Form von Templatemodi. Daher ist es nicht gestattet, dass in einem Stylesheet (z.B. durch Inklusion eines Stylesheetmoduls) zwei gleich benannte Templates gleicher Importpräzedenz erscheinen. Eine Anwendung kann das als letztes deklarierte Template verwenden oder einen Fehler melden. Kein Fehler ist es dagegen, wenn sich Dubletten durch Import von Stylesheetmodulen ergeben, solange eine von ihnen höhere Importpräzedenz als die restlichen besitzt.

Ein benanntes Template kann ein as-Attribut besitzen, um den Sequenztyp der zurückgegebenen Sequenz festzulegen, jedoch weder ein mode- noch ein priority-Attribut, solange nicht auch ein match-Attribut vergeben ist. In diesem Fall handelt es sich bei dem benannten Template ebenfalls um eine Template-Regel.

Template-Regeln mit match-Pattern:
Unter einer Template-Regel (oft auch einfach als »Template« bezeichnet) versteht man eine xsl:template-Deklaration, die über ein match-Attribut verfügt. (Anmerkung: Zusätzlich kann auch ein name-Attribut vorliegen, das die Template-Regel gleichzeitig als benanntes Template verwendbar macht, siehe oben.)

Im match-Attribut der Template-Regel ist in Form eines XPath-Patterns ein Vergleichsmuster definiert, das bestimmt, für welche zur Verarbeitung anstehenden Knoten das Template aktiviert werden soll.

Kann ein anstehender Knoten von mehreren (nicht identischen) Template-Regeln verarbeitet werden, so wird die Template-Regel mit der höchsten Priorität gewählt. Gewöhnlich handelt es sich um diejenige, deren XPath-Pattern am genauesten auf den anstehenden Knoten passt, wobei auch dessen Kontext (durch Beschreibung möglicher Vorgängerknoten oder durch Verwendung von Predicates) verwendet werden kann.

So ist als Pattern match="beispiel/test" expliziter als match="test" oder gar match="element()". Die sich durch die Struktur des verwendeten Patterns ergebende natürliche Priorität wird auch als Defaultpriorität bezeichnet (sie ist in der weiter unten folgenden Tabelle erläutert). Zusätzlich kann die Priorität einer Template-Regel auch durch das priority-Attribut auf einen beliebigen Wert festgelegt werden.

Zwischen zwei Template-Regeln, die sich im match-Pattern gleichen, kann durch den Verarbeitungsmodus unterschieden werden. In diesem Fall kann ein Template nur durch einen anstehenden Knoten aktiviert werden, wenn dieser mit einem Verarbeitungsmodus angeboten wird, dessen Bezeichner in der Tokenliste des mode-Attributs enthalten ist. Eine Template-Regel mit mode-Attribut kann also nur bei einem Aufruf mit entsprechendem Modus aktiviert werden, eine Template-Regel ohne mode-Attribut nur durch einen Aufruf ohne Modus.

Hinweis – in XSLT 1.0 ist maximal ein Modus gleichzeitig möglich:
Es ist zu beachten, dass eine Template-Regel in XSLT 1.0 nur maximal einen Modus verarbeiten kann, da das mode-Attribut dort nur einen einzelnen QName eines Modus enthalten darf.

Es ist ein Fehler, wenn mehrere identische Template-Regeln, also mit gleichem match-Pattern, gleicher Importpräzedenz und gleichem Modus im selben Stylesheet auftreten.

Die natürliche Priorität der Template-Regel:
Die natürliche Priorität (default priority) einer Template-Regel ergibt sich aus der Struktur ihres match-Patterns und nimmt Werte zwischen +0.5 und -0.5 an, wobei die exakter auf den zur Verarbeitung anstehenden Knoten passenden Pattern generell höher eingestuft werden.

Besitzt eine Template-Regel zwei oder mehr alternative, durch den Union-Operator (Anmerkung: Es handelt sich hier um den logischen AND-Operator und nicht, wie oft populär ausgedrückt, um den Oder-Operator.) »|« verknüpfte Pattern, beispielsweise in der Form match="pattern_a | pattern_b", so erhält sie entsprechend viele (auch unterschiedliche) Prioritäten, die den Vergleich mit Template-Regeln ermöglichen, die ein dem jeweiligen Einzelpattern ähnliches Muster aufweisen.

In der folgenden Tabelle sind verschiedene XPath-Pattern mit ihren Prioritäten aufgelistet. In XSLT 2.0 sind alle diese Pattern gültig, in XSLT 1.0 nur jene, mit XPath 1.0 bezeichneten

Patternform Herkunft Match auf Priorität

Nennung von Vorfahren, Verwendung von Predicate

XPath 1.0

Knoten, allgemein

+0.5

element(qname, Schema-Typ)

XPath 2.0

Elementknoten (QName fix, Schema-Typ fix)

+0.25

attribute(@qname, Schema-Typ)

XPath 2.0

Attributknoten (QName fix, Schema-Typ fix)

+0.25

qname

XPath 1.0 

Elementknoten (QName fix, Schema-Typ frei)

0

child::qname

XPath 1.0

element(qname)

XPath 2.0

element(qname, *)

XPath 2.0

@qname

XPath 1.0

Attributknoten (QName fix, Schema-Typ frei)

0

attribute::qname

XPath 1.0

attribute(@qname)

XPath 2.0

attribute(@qname,*)

XPath 2.0

element(*, Schema-Typ)

XPath 2.0

Elementknoten (QName frei, Schema-Typ fix)

0

attribute(@*, Schema-Typ)

XPath 2.0

Attributknoten (QName frei, Schema-Typ fix)

0

processing-instruction('targetname')

XPath 1.0

PI-Knoten; Targetname als xs:string

0

präfix:*

XPath 1.0

Elementknoten (Namensraum fix)

-0.25

child::präfix:*

XPath 1.0

*:local-name

XPath 1.0

Elementknoten (lokaler Name fix)

-0.25

child::*:local-name

XPath 1.0

@präfix:*

XPath 1.0

Attributknoten (Namensraum fix)

-0.25

attribute::präfix:*

XPath 1.0

@*:local-name

XPath 1.0

Attributknoten (lokaler Name fix)

-0.25

attribute::*:local-name

XPath 1.0

*

XPath 1.0

Elementknoten, allgemein

-0.5

element()

XPath 2.0

element(*, *)

XPath 2.0

@*

XPath 1.0

Attributknoten, allgemein

-0.5

attribute()

XPath 2.0

attribute(@*, *)

XPath 2.0

/

XPath 1.0

Dokument-Node

-0.5

document-node()

XPath 2.0

comment()

XPath 1.0

Kommentar

-0.5

text()

XPath 1.0

Textknoten

-0.5

node()

XPath 1.0

Knoten, allgemein

-0.5

Tabelle: Die natürliche Priorität von XPath-Pattern.

Die natürliche Priorität (Defaultpriorität) wird sowohl in XSLT 1.0 als auch in XSLT 2.0 anhand der Form des im match-Attribut enthaltenen Patterns bestimmt. In XSLT 1.0 wird dieses allerdings in XPath 1.0 formuliert – die oben mit XPath 2.0 gekennzeichneten Pattern können nicht verwendet werden, da die KindTests element() und attribute() sowie document-node() hier noch nicht existieren. Ebenso wenig ist die Abfrage von XML Schematypen in XPath 1.0 möglich. Es gibt also zu den mit +0.25 bezeichneten, typbezogenen Patternformen keine in XPath 1.0 formulierbaren Analogien. 

Ist ein priority-Attribut für eine Template-Regel gesetzt, so gilt dessen Wert vorrangig, unabhängig vom möglicherweise höheren Defaultwert.

Hinweis – Keine Priorität bei benannten Templates:
In Zusammenhang mit benannten Templates und deren Aufruf durch xsl:call-template ist das Konzept der Priorität nicht anwendbar. Ein benanntes Template kann jedoch gleichzeitig ein match-Attribut (und dann gegebenenfalls ein priority-Attribut) besitzen, sodass eine Priorität für diese Regel dann von Belang ist, wenn sie auf anderem Wege (d.h. über xsl:apply-templates etc.) als Template-Regel aktiviert wird.

Default-Template-Regeln:
Stets implizit im Stylesheet gegenwärtig, deshalb nicht zwangsläufig explizit zu definieren, sind die sogenannten Default-Temp­lates. Sie treten in Kraft, wenn für einen zur Verarbeitung anstehenden Knoten keine passende Template-Regel deklariert ist. Ihre Priorität ist dementspre­chend niedrig und liegt bei -0.5. Jede beliebige explizite Template-Regel ist daher gleich- oder höherrangig (bei Gleichrangigkeit gewinnt das explizite Template). Es existieren Default-Template-Regeln für alle gängigen Knotenty­pen:

Elemente:
Das implizite Default-Template für Elemente sieht folgendermaßen aus:

<xsl:template match="*">
   <xsl:apply-templates/>
</xsl:template>

Der Stern als Wildcard veranlasst, dass dieses Template immer dann aktiv wird, wenn kein anderes passendes aufzufinden ist. Außer einem xsl:apply-templates enthält es keine Anweisungen. Es dient lediglich dazu, den Verarbeitungsprozess weiterzuführen, der sonst hier unterbro­chen würde.

Die Annahme, die zugrunde liegt, ist, dass für eventuelle Child-Elemente wieder explizite Templates vorhanden sein könnten. Das Template verarbei­tet alle Modes und reicht sie an Folgetemplates weiter (sticky mode), könnte also der Deutlichkeit halber so geschrieben werden:

<xsl:template match="*" mode="*">
   <xsl:apply-templa­tes/>

</xsl:template>

Dokumentknoten:
Auch für den Dokumentknoten existiert ein Defaulttemplate:

<xsl:template match="/">
   <xsl:apply-templates/>
</xsl:template>

Dies sichert den Einstieg in die Verarbeitung eines XML-Dokuments und führt dazu, dass der Verarbeitungsprozess in jedem Fall irgendwann zu einem Element gelangt, für das ein explizites Template vorliegt.

Textknoten:
Ein weiteres Default-Template existiert für Textknoten:

<xsl:template match="text()">
   <xsl:value-of select="."/>
</xsl:template>

Die Instruktion xsl:value-of kopiert hier den Stringwert des aktuellen Knotens, also in diesem Fall den Textknoten selbst in den Ergebnisbaum.

Attributknoten:
Das Default-Template für Attribute sorgt dafür, dass der Stringwert eines beliebigen Attributknotens @* in das Ergebnisdokument kopiert wird. Es ist dafür ein vorheriger Wechsel auf die Attributachse erfor­derlich.

<xsl:template match="@*">
   <xsl:value-of select="."/>
</xsl:template>

Kommentar- und PI-Knoten
Schließlich gibt es zwei Defaulttemplates für Kommentarknoten und Processing-Instructions:

<xsl:template match="comment()"/>
<xsl:template match="processing-instructions()"/>

Beide Templates sind leer und dienen nur dazu, eine (ungewollte) Verarbei­tung dieser Knotentypen abzufangen. Ist eine Verarbeitung eines der beiden Knotentypen gewünscht, so kann das Default-Template durch eine explizite Template-Regel ersetzt werden.

Hinweis – Durchtunneln von Default-Templates in XSLT 2.0:
In XSLT 2.0 geben die Default-Template-Regeln an sie übergebene Parameter transpararent an eventuelle Folgetemplates weiter. Eine entspre­chende Durchtunnelung der Defaultregeln existiert in XSLT 1.0 dagegen nicht.

Beispiele:

Beispiel 1 – Einsatz von verschiedenen Template-Regeln:

Das XML-Dokument (Auszug):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<buch>
  <buchtitel>Der Buchtitel</buchtitel>
  <kapitel>
    <kapiteltitel>Kapitel Eins</kapiteltitel>
    <abschnitt>Der erste Abschnitt ...</abschnitt>
    <!-- mehr Abschnitte -->
  </kapitel>
  <!-- mehr Kapitel -->
</buch>

Stylesheet (Auszug):

...
<!-- Template-Regel für den Dokumentknoten (gekürzt) -->
<xsl:template match="/">
  <html>
    ...
    <xsl:apply-templates/>
    ...
  </html>
</xsl:template>
<!-- Template-Regel für das Wurzelelement -->
<xsl:template match="buch">
  <xsl:apply-templates select="buchtitel"/>
  ...
  <xsl:apply-templates select="kapitel"/>
</xsl:template>
<!-- Template-Regel für den Buchtitel -->
<xsl:template match="buchtitel">
  <h1><xsl:apply-templates/></h1>
</xsl:template>
<!-- Template-Regel für Kapitel -->
<xsl:template match="kapitel">
  <xsl:apply-templates select="kapitelueberschrift"/>
  <!-- den Kapiteltext verarbeiten -->
  ...
  <xsl:apply-templates/>
</xsl:template>
<!-- Template-Regel für Kapitelüberschrift -->
<xsl:template match="kapitelueberschrift">
  <h1><xsl:value-of select="."/></h1>
</xsl:template>

Für das oben angedeutete einfache XML-Dokument liegt im Stylesheet pro Ele­ment je eine Template-Regel vor. Die Verarbeitung beginnt mit der Template-Regel für den Dokumentknoten (match="/"), die erste Knoten in die Ergebnis­sequenz ausgibt und unspezifisch Folgetemplates aufruft (da <buch> einziger Kindknoten ist, wird nur die entsprechende Regel aktiv).

Mit xsl:apply-templates werden aus der Template-Regel für das <buch>-Ele­ment heraus gezielt Nodesequenzen erzeugt, die die folgenden Template-regeln aktivieren. Für das Element <abschnitt> existiert keine Template-Regel, wes­halb es vom eingebauten Default-Template für Elemente verarbeitet wird.

Beispiel 2 – Benanntes Template mit name-Attribut

<xsl:template match="buch">
  <xsl:apply-templates select="buchtitel"/>
  <xsl:call-template name="inhalt"/>
  <xsl:apply-templates select="kapitel"/>
</xsl:template>
<xsl:template name="inhalt">
  <!-- Inhaltsverzeichnis generieren: -->
  <h2>Inhaltsverzeichnis:</h2>
  <ul>
    ...
  </ul>
</xsl:template>

Für die HTML-Umsetzung des Buchs soll auch ein Inhaltsverzeichnis erstellt werden. Hierfür wird mit xsl:call-template ein als "inhalt" benanntes Template aufgerufen.

Beispiel 3 – Template-Regeln mit mode-Attribut:

<xsl:template name="inhalt">
  <!-- Inhaltsverzeichnis generieren: -->
  <h1>Inhaltsverzeichnis:</h1>
  <ul>
    <xsl:apply-templates select="//kapitelueberschrift" mode="inhalt"/>
  </ul>
</xsl:template>
<!-- mit mode für das Inhaltsverzeichnis -->
<xsl:template match="kapitelueberschrift" mode="inhalt">
  <li><xsl:value-of select="."/></li>
</xsl:template>
<!-- ohne mode für die Textausgabe des Buchs -->
<xsl:template match="kapitelueberschrift">
  <h1><xsl:value-of select="."/></h1>
</xsl:template>

Für das Inhaltsverzeichnis sollen die Kapitelüberschriften ausgegeben werden, für deren Element <kapitelueberschrift> jedoch bereits eine Template-Regel existiert, die für die Ausgabe des Buchtextes gedacht ist.

Die abweichende Formatierung für das Inhaltsverzeichnis wird von einer Tem­plate-Regel mit einem Verarbeitungsmodus "inhalt" übernommen, die durch eine entsprechend mit mode-Attribut versehene xsl:apply-templates-Instruktion aufgerufen wird.

Beispiel 4 – Template-Regeln mit use-when und priority-Attribut:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/" priority="10" use-when="number(system-property('xsl:version')) = 1.0">
    <xsl:text>Dies läuft als XSLT 1.0</xsl:text>
    <!-- XSLT 1.0 Anweisungen -->
  </xsl:template>
  <xsl:template match="/" priority="9" use-when="number(system-property('xsl:version')) &gt;= 2.0">
    <xsl:text>Läuft als XSLT </xsl:text>
    <xsl:value-of select="system-property('xsl:version')"/>
    <xsl:for-each-group select="bla">
      <!-- XSLT 2.0 Anweisungen -->
    </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>
  

Soll ein Stylesheet der Version 2.0 auch auf einem XSLT 1.0-Prozessor laufen (wenn auch vielleicht mit anderem Ausgabeergebnis, aber jedenfalls ohne Fehlermeldung), so kann mit einer Kombination aus use-when-Attribut (dem XSLT 1.0-Prozessor unbekannt) und priority-Attribut (allen Prozessoren bekannt) gearbeitet werden. Beachten Sie, das beide hier enthaltenen Template-Regeln das gleiche match-Attribut besitzen.

Zunächst ist es wichtig zu bemerken, dass aufgrund der Version 2.0 des Stylesheets ein XSLT 1.0-Prozessor im vorwärtskompatiblen Modus arbeiten wird. Dies bedeutet, dass er die ihm unbekannten use-when-Attribute beider Template-Regeln nicht beachten wird. Der höhere Wert des priority-Attribust der ersten Regel wird ihn jedoch veranlassen, diese auszuführen und die andere zu ignorieren.

Ein XSLT 2.0-Prozessor wurde eigentlich gemäß des priority-Attributs ebenfalls die erste Regel favorisieren. Da diese für ihn in der Tat vorrangig wäre, muss verhindert werden, dass sie überhaupt eingelesen wird. Hierzu dient das use-when-Attribut. Beim Auswerten erfährt der XSLT 2.0-Prozessor, dass die erste Regel nicht für ihn gedacht ist (wohl aber die zweite). Er betrachtet sie, trotz des priority-Attributs als nicht existent und arbeitet mit der ihm zugedachten, zweiten Regel.

Elementdefinition:

XSLT 1.0:

<!-- Category: top-level-element -->
<xsl:template 
     match = pattern 
     name = qname 
     priority = number 
     mode = qname>

     <!-- Content: (xsl:param*, template) -->
</xsl:template>

XSLT 2.0:

<!-- Category: declaration -->
<xsl:template
     match? = pattern
     name? = qname
     priority? = number
     mode? = tokens
     as? = sequence-type >

     <!-- Content: (xsl:param*, sequence-constructor) -->
</xsl:template>
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