XML-Know How

Template-Elemente

xsl:template

Das Top-Level-Element <xsl:template> enthält jeweils ein Template, also eine Verarbeitungsanweisung, und steuert damit als zentrales Element die Ausgabe der Daten. Das Element wird meist in Verbindung mit dem Attribut match verwendet, in dem sich das Suchmuster befindet. Das Suchmuster kann die unterschiedlichsten Inhalte haben. Die häufigsten sind die Suche nach Elementen (ggf. in ihrem hierarchischen Verhältnis zu anderen Elementen) und nach Attributwerten.

Der Wurzelknoten

Ein Standardfall (und in der Regel das erste Template in einem Stylesheet) ist die Suche nach dem Wurzelknoten (Root Node), der mit match="/" angesteuert wird. Der Wurzelknoten ist eine virtuelle Einheit und bezeichnet das gesamte XML-Dokument inklusive des Wurzelelements. Mit <xsl:template match="/"> wird also stets das gesamte XML-Dokument verarbeitet – unabhängig davon, wie das Wurzelelement lautet. Der Wurzelknoten bildet für XPath-Ausdrücke stets den Startpunkt von absoluten Suchmustern.

xsl:apply-templates

Nun befinden sich innerhalb des Wurzelknotens ja alle weiteren Elemente – es müssen also innerhalb des ersten Template alle weitere Templates eingebettet werden. Hierzu benutzt man das <xsl:apply-templates>-Element, um den Prozessor anzuweisen, nach Kindelementen des aktuellen Elementes zu suchen und – wenn vorhanden – deren Templates auszuführen. Wenn kein weiteres Template zur Verarbeitung einer Teilstruktur vorhanden ist, soll der Inhalt der Teilstruktur eingesetzt werden.

Erstellen wir uns also ein erstes, eigenes XSLT-Stylesheet:

Beispiel: Ein einfaches XSLT-Stylesheet zur Überführung der XML-Daten nach HTML

<?xml version="1.0" encoding="UTF-8"?>[1]

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/[2] Transform" version="1.0">[3]

<xsl:output method="html" version="4.01" [4] encoding="UTF-8"/>[5]

<xsl:template match="/">[6]

<html>[7]

<head>[8]

<title>Erstes Transformationsergebnis</title>[9]

</head>[10]

<body>[11]

<xsl:apply-templates/>[12]

</body>[13]

</html>[14]

</xsl:template>[15]

<xsl:template match="rezept">[16]

<div class="rezept">[17]

<xsl:apply-templates/>[18]

</div>[19]

</xsl:template>[20]

<xsl:template match="ueberschrift1">[21]

<h3>[22]

<xsl:apply-templates/>[23]

</h3>[24]

</xsl:template>[25]

<xsl:template match="zutaten">[26]

<p>[27]

<xsl:apply-templates/>[28]

</p>[29]

</xsl:template>[30]

</xsl:stylesheet>[31]

Das Beispiel-Stylesheet besteht aus insgesamt vier Templates, jeweils umschlossen von den Tags <xsl:template> (…) </xsl-template>.

Build-in-Templates

Das erste Template führt dazu, dass in der Ausgabedatei um alle anderen Daten herum die Grundstruktur einer HTML-Datei mit <head> und <body> eingefügt wird. Die erste <xsl:apply-templates/> Anweisung (Zeile 12) bewirkt, dass der Prozessor für alle auf das Wurzelelement folgenden Elemente nach Templates im Stylesheet sucht und – wenn vorhanden – diese ausführt. Alle passenden Templates eines Stylesheets werden iterativ (schrittweise in wiederholenden Arbeitsschritten) abgearbeitet. Sollte der Prozessor auf kein passendes Template treffen, wird der textliche Inhalt des Elementes ohne Template-Entsprechung an genau dieser Stelle (also zwischen den Tags <body> und </body> eingefügt. Dass dies geschieht, liegt an sogenannten »Build-in-Templates«, die in jedem XSLT-Prozessor hinterlegt sind. Eines dieser Build-in-Templates bewirkt, dass Textknoten des Quelldokuments im Zieldokument wieder ausgegeben werden. Auch die Build-in-Templates werden über den <xsl:apply-templates/>-Befehl mit angesteuert.

Das Template ab Zeile 16 steuert alle rezept-Knoten des Quelldokuments an und umschließt deren Inhalt mit dem HTML-Tag <div class="rezept"> (Zeile 17) bzw. </div> (Zeile 19). In Zeile 18 wird mit <xsl:apply-templates/> abermals nach Entsprechungen für alle weiteren Templates gesucht und alternativ der Inhalt eingefügt.

Analog dazu wird ab Zeile 21 die <ueberschrift1> in eine HTML-Überschrift <h3> umgewandelt, ab Zeile 26 die <zutaten> in einen HTML-Absatz <p>.

Das Ergebnis dieser ersten Transformation kann sich bereits sehen lassen – es ist eine (fast) vollständige HTML-Datei:

Beispiel:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Erstes Transformationsergebnis</title>

</head>

<body>

Willkommen bei meinem Kochbuch!

<div class="rezept">

<h3>Huhn mit Rosmarinkartoffeln</h3>

<p>1 frisches Huhn</p>

</div>

<div class="rezept">

<h3>Selleriesuppe</h3>

<p>1 Bund Sellerie </p>

(…)

</div>

(…)

</body>

</html>

Im Browser dargestellt sieht diese Seite so aus:

Abb. 43 Das Ergebnis der Transformation im Browser

Es fällt auf, dass auch die Inhalte der Elemente, für die noch kein eigenes Template definiert wurde, in der Zielstruktur wieder auftauchen (z. B. der Inhalt des Elements <vorwort>, aber auch von <menge> und <masseinheit>). Es ist also nicht erforderlich, für sämtliche Strukturelemente eines XML-Quelldokuments eigene Templates aufzubauen, solange lediglich deren Inhalt unverändert wiedergegeben werden soll.

Nach diesem Prinzip lässt sich das XSLT-Stylesheet nun beliebig erweitern, um sämtliche Elemente der Quellinstanz individuell umzusetzen. In der Praxis wird man natürlich nicht an einer konkreten Instanz, sondern an der dieser Instanz zugrunde liegenden DTD entlang arbeiten, so dass mit dem entstandenen Stylesheet beliebige XML-Instanzen, die der gleichen DTD folgen, nach HTML transformiert werden können.