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 Textknoten 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 Ausgang, der es dem Prozessor ermöglicht, weitere Template-Regeln für untergeordnete Elemente zu aktivieren, sofern solche existieren. Das Gute am pauschalen Einsatz von xsl:apply-templates ist, dass man sich eben darum nicht kümmern 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 Gattungen. Auch Textknoten gehören dazu. Also steht fest, dass auch diese verarbeitet 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 verwendet 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 geschehen. In diesem Fall müssen dem match-Attribut der Regel zwei Vergleichsmuster übergeben werden. Dies funktioniert, indem man sie durch den Oder-Operator »|« 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 Reihenfolge 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