Eine Template-Regel pro Element – beinahe ...

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

Hier wird also ein kleiner Rückbau in Bezug auf die Komplexität vorgenommen und dafür mit einer Reihe einfacher Template-Regeln nachgerüstet.

Ausgehend vom Stylesheet adressen.xsl aus Ein Vergleich: Ausdruck vs. Instruktion erfolgen ein paar Änderungen: In der Template-Regel für <adresse> lässt man nun das select-Attribut von xsl:apply-templates einfach weg:

<!-- Template-Regel für <adresse>: -->
<xsl:template select="adresse">
  <!-- Sequenz der Kindelemente von Adresse: -->
  <p><xsl:apply-templates/></p>
  <!-- Trennlinie: --><hr/>
</xsl:template>

Nach jeder Adresse soll eine horizontale Trennlinie eingezogen werden, was mittels des HTML-Elements <hr> gelöst wird (im Stylesheet in XML-Schreibweise). Auch die Regel für <name> wird geringfügig umgebaut:

<!-- Template-Regel für <name>: -->
<xsl:template match="name">
  <xsl:text>Name: </xsl:text>
  <b><xsl:apply-templates/></b><br/>
</xsl:template>

Hinweis:
Die Instruktion xsl:text wird in diesem Fall eingesetzt, um das überflüssige Mitkopieren des Zeilenumbruchs zu vermeiden, der nach dem Start-Tag der Template-Regel steht.

Die Template-Regel für <anschrift> wird radikal vereinfacht:

<!-- Template-Regel für <anschrift>: -->
<xsl:template match="anschrift">
  <xsl:text>Anschrift: </xsl:text>
  <xsl:apply-templates/>
</xsl:template>

Die folgenden Regeln werden »als Ausgleich« hinzugefügt:

<!-- Template-Regel für <strasse>: -->
<xsl:template match="strasse">
  <xsl:apply-templates/>
</xsl:template>

<!-- Template-Regel für <nr>: -->
<xsl:template match="nr">
  <xsl:apply-templates/>
</xsl:template>

<!-- Template-Regel für <plz>: -->
<xsl:template match="plz">
  <xsl:apply-templates/>
</xsl:template>

<!-- Template-Regel für <ort>: -->
<xsl:template match="ort">
  <xsl:apply-templates/>
</xsl:template>

Code-Beispiel: kap01/1.17.2/addressen.xsl (Auszug).

Die »tun« ja gar nichts, könnte man einwenden. Und warum steht hier xsl:apply-templates statt xsl:value-of? In der Tat bewirkt die Aktivierung dieser Template-Regeln weiter nichts. Bei der Verarbeitung dieser Elemente soll ja (derzeit) auch nichts weiter geschehen, als dass der in ihnen enthaltene Text­knoten ins Ergebnisdokument transferiert wird. Liegen die Regeln aber erst vor, so ist es einfach, sie zu erweitern.

Beispiel für Erweiterungsmöglichkeiten

Um eine CSS-Formatierung des erzeugten HTML-Dokuments vorzunehmen, möchten Sie per HTML-Element <span> entsprechende CSS-Klassen einbinden? Bitte schön, kein Problem:

<!-- alternative Template-Regel für <ort> mit CSS-Klasse: -->
<xsl:template match="ort">
  <span class="ort"><xsl:apply-templates/></span>
</xsl:template>

Und warum xsl:apply-templates als innen liegende Instruktion? Dies ist eher eine Prinzipfrage, denn für das vorliegende Quelldokument wäre xsl:value-of in der Tat genauso tauglich.

Sollte allerdings ein Element jedoch nicht nur einen Textknoten, sondern dar­über hinaus weitere Elemente als Inhalt besitzen, so würden diese nicht separat verarbeitet, sondern lediglich ihre Stringinhalte extrahiert.

Durch xsl:apply-templates schafft man in einer Template-Regel einen Aus­gang, der es dem Prozessor ermöglicht, weitere Template-Regeln für untergeord­nete Elemente zu aktivieren, sofern solche existieren. Das Gute am pauschalen Einsatz von xsl:apply-templates ist, dass man sich eben darum nicht küm­mern muss.

Durch die konsequente Verwendung von xsl:apply-templates erlaubt man dem Quelldokument die Verarbeitung durch die Abfolge seiner Inhalte, also seine Struktur, zu steuern.

Ohne select-Attribut bildet xsl:apply-templates pauschal eine Sequenz aller Kindknoten des Kontextknotens. Das Default-Verhalten der Instruktion entspricht sozusagen select="node()". Ausgewählt werden Knoten aller Gat­tungen. Auch Textknoten gehören dazu. Also steht fest, dass auch diese verar­beitet werden; mehr ist ja nicht beabsichtigt. Und obendrein ist <xsl:apply-templates/> auch kürzer formuliert (Anmerkung: Unter bestimmten Umständen darf xsl:value-of zwar auch ohne select-Attribut verwen­det werden, nicht aber in diesem Fall.) als <xsl:value-of select="."/>.

Eine Template-Regel für zwei Elemente

Ist man ganz sicher, dass zwei Elemente stets auf identische Weise verarbeitet werden sollen, dann kann dies in einer gemeinsamen Template-Regel gesche­hen. In diesem Fall müssen dem match-Attribut der Regel zwei Vergleichsmus­ter übergeben werden. Dies funktioniert, indem man sie durch den Oder-Ope­rator »|« trennt:

<!-- Template-Regel für <plz> und <nr>: -->
<xsl:template match="plz | nr">
  <xsl:apply-templates/>
</xsl:template>

Es können auch drei oder mehr alternative Muster verwendet werden. Die Rei­henfolge der Pattern im Ausdruck spielt keine Rolle, da sie alle unabhängig voneinander geprüft werden.

   

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