Templates und Template-Mode

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

Sollen gleiche Elemente mehrmals, aber in verschiedenem Kontext ausgegeben werden, so kann normalerweise nicht die gleiche Template-Regel verwendet werden. Zum Beispiel können die Überschriften <titel> eines Buchkapitels an zwei Stellen im Stylesheet angesprochen werden: einmal bei der Generierung eines Inhaltsverzeichnisses, dann wieder bei der Textausgabe in ihrer Funktion als Kapitelüberschrift.

Verschieden gestimmte Template-Regeln: das mode-Attribut

Es kann nicht die gleiche Ausgabeformatierung verwendet werden, da der Textinhalt der Überschrift einmal in einem HTML-<li>-Listenelement ver­wendet werden soll, aber sonst in HTML-<h1>-Container gestellt wird:

<!-- für das Inhaltsverzeichnis -->
<xsl:template match="titel">
  <li><xsl:value-of select="."/></li>
</xsl:template> 
<!-- für die Textausgabe im Buch -->
<xsl:template match="titel">
  <h1><xsl:value-of select="."/>
</xsl:template>

Dies ist ein klarer Fall für einen Template-Konflikt, da beide Template-Regeln exakt auf den gleichen Knoten passen. Der Prozessor löst dies in der Praxis am ehesten dadurch, dass er nur die letzte unter gleichrangigen Regeln beachtet. Im betrachteten Fall wäre dies ausgesprochen unerwünscht.

Die Lösung: das mode-Attribut

Um dieses Problem aus der Welt zu schaffen, gibt es für xsl:template noch ein weiteres (bisher unterschlagenes) Attribut: mode. Dieses Attribut schafft zwischen mehreren und ansonsten identischen Templates ein künstliches Unter­scheidungskriterium. Es müssen also die beiden oberen Templates nur entspre­chend erweitert werden, um sie für den Prozessor wieder unterscheidbar zu machen:

<!-- für das Inhaltsverzeichnis -->
<xsl:template match="titel" mode="inhalt">
  <li><xsl:value-of select="."/></li>
</xsl:template> 
<!-- für die Textausgabe im Buch -->
<xsl:template match="titel" mode="text">
  <h1><xsl:value-of select="."/>
</xsl:template>

Der Aufruf eines Templates erfolgt im Grunde indirekt. Der Prozessor sucht für eine zusammengestellte Nodesequenz nach dem Template mit dem zutref­fendsten match-Attribut. Das oben angesprochene Dilemma bestand darin, dass eben nicht nur ein solches Template vorhanden war, sondern zwei. Ein Schritt zur Lösung des Problems ist immerhin getan.

Welcher Modus soll es sein?

Jetzt, mit gesetztem mode-Attribut, muss dem Prozessor nur noch vermittelt werden, welcher Template-Modus bei der Verarbeitung verwendet werden soll. Das mode-Attribut muss also beim Zusammenstellen der Sequenz ebenfalls dem Aufruf xsl:apply-templates hinzugefügt werden:

<xsl:template match="inhalt">
  <div>Inhaltsverzeichnis:
    <ul>
      <xsl:apply-templates select="//titel" mode="inhalt"/>
      ...
    </ul>
  </div>
</xsl:template> 
<xsl:template match="kapitel">
  <xsl:apply-templates select="titel" mode="text"/>
  <!-- und den Kapiteltext verarbeiten -->
</xsl:template>

Das Template mit dem mode-Attribut wird nur dann angesprochen, wenn beim Aufruf ebenfalls ein entsprechendes mode-Attribut gesetzt ist. Wird kein ent­sprechendes mode-Attribut gefunden, so wird nicht etwa ein Template ohne Modus verwendet, sondern es findet gar keine Verarbeitung statt! Templates mit und ohne Modus können also koexistieren.

Benannte Templates: mode nicht benötigt

Ein benanntes xsl:template-Element besitzt keinen Template-Modus. Unter anderem macht dies keinen Sinn, weil der Aufruf per xsl:call-template erfolgt, und diese Instruktion nicht die Übergabe eines Modus vorsieht.

Allerdings darf ein benanntes Template ein zusätzliches match-Attribut besit­zen, also gleichzeitig auch als Template-Regel zur Verfügung stehen. Ist dies der Fall, so kann das Template auch über xsl:apply-templates aktiviert werden, auch mit Übergabe eines Modus. Daher kann ebenfalls ein zusätzliches mode-Attribut vorliegen. Im Kontext des Aufrufs über den Template-Namen durch xsl:call-template wird jedoch weder das match- noch das mode-Attribut beachtet.

   

<< zurück vor >>
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