XML-Know How

Template-Elemente

Das Top-Level-Element <xsl:template> umschließt jeweils ein Template, also eine Verarbeitungsanweisung und steuert damit als zentrales Element die Ausgabe von Daten. Das Element wird meist in Verbindung mit dem Attribut match verwendet. Dieses Attribut erwartet als Wert ein Suchmuster (pattern). Findet der Prozessor in der Instanz eine Übereinstimmung mit dem Suchmuster, so werden die im Template-Element aufgeführten Anweisungen und Daten instanziiert, d. h. ausgeführt und ausgegeben. Der Prozessor sucht also im Eingabebaum (= in der zu verarbeitenden XML-Instanz) nach einer Übereinstimmung mit dem angegebenen Suchmuster und führt, sobald er fündig wird, das Template aus, d. h. was durch die »Schablone« passt, wird in seiner Zielstruktur in den Ausgabebaum eingefügt.

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.

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. Als Wurzelknoten wird derjenige Knoten bezeichnet, der das gesamte Dokument umschließt und als Kindelement das Wurzelelement (Root Element) enthält.[1] Der Wurzelknoten bildet den Startpunkt von absoluten Suchmustern.

Nun befinden sich innerhalb des Wurzelknotens ja alle weiteren Elemente – es müssen also innerhalb des ersten Template 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.

Das wollen wir uns an einem ersten, einfachen Stylesheet verdeutlichen:

  1   <xsl:template match="/">
  2      <HTML>
  3        <xsl:apply-templates/>
  4      </HTML>
  5   </xsl:template>
  6   <xsl:template match="PERSONEN">
  7      <xsl:apply-templates/>
  8   </xsl:template>
  9   <xsl:template match="PERSON">
10      <xsl:apply-templates/>
11   </xsl:template>

(Die Zeilenzählung dient der nachfolgenden Erläuterung des Stylesheets und ist nicht Bestandteil desselben)

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

Das erste Template führt dazu, dass in der Ausgabedatei um alle anderen Daten herum die Tags <HTML> (Zeile 2) und </HTML> (Zeile 4) eingefügt werden. Die erste <xsl:apply-templates/> Anweisung (Zeile 3) bewirkt, dass der Prozessor für alle auf das Wurzelelement folgenden Elemente nach Templates im Stylesheet sucht und – wenn vorhanden – diese ausführt. Sollte er jedoch auf kein passendes Template treffen, wird der textliche Inhalt des Elementes ohne Templateentsprechung eingefügt. Alle passenden Templates eines Stylesheets werden iterativ abgearbeitet.

Die Zeilen 6 bis 11 unseres ersten Stylesheets sind damit noch ohne Funktion; der Prozessor lieferte das gleiche Ergebnis, wenn das Stylesheet nur aus den Zeilen 1 bis 5 bestünde, nämlich folgende Datei:

<HTML>MonteroManuel18.05.1974HeidelbergOttTobias13.10.1969
Tübingen</HTML>

Im zweiten Schritt wollen wir nun durch Modifikation der Zeilen 7 und 10 die HTML-Ausgabe unserer XML-Testinstanz weiter verfeinern. Mit <xsl:apply-templates/> rufen wir auch weiterhin den Inhalt der Elemente (und weitere Templates) ab, fügen nun aber zwischen <xsl:template> und </xsl-template> sowohl weitere HTML-Tags als auch freien Text ein:

6   <xsl:template match="PERSONEN">
7      <H2>Personen:</H2> <xsl:apply-templates/>
8   </xsl:template>
9   <xsl:template match="PERSON">
10      <P><xsl:apply-templates/></P>
11   </xsl:template>

Das nun erreichte Ergebnis sieht bereits einer »echten« HTML-Datei nicht unähnlich:

<HTML>
<H2>Personen:</H2>
<P>MonteroManuel18.05.1974Heidelberg</P>
<P>OttTobias13.10.1969Tübingen</P>
</HTML>

Im Browser angezeigt sieht diese Datei folgendermaßen aus:

Nach demselben Schema lassen sich nun sämtliche in der Instanz vorkommenden Elemente gezielt modifizieren. In der Praxis wird man sich hier natürlich nicht nur an einer 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.


     

  1. ↑  Der Grund für die Einführung dieses »Urknotens« besteht darin, dass mit seiner Hilfe auch eingebettete DTDs und PIs bearbeitet werden können, da diese ebenfalls Kindelemente des Wurzelknotens sind.
  2.