Die so genannten Schablonen bewirken die gesamte Verarbeitung eines Quelldokuments zu einem Zieldokument (template rules). Sie regeln, welche Elemente aus dem Eingabebaum in die Ausgabe gelangen, in welcher Form diese das tun oder ob sie vielleicht gar nicht im resultierenden Baum landen. Dabei dienen Muster (patterns) im Attribut match dazu, zu klären, auf welchen Knoten der Eingabe sich das Template bezieht. Diese Muster sind die in Kapitel 7 dargestellten Ausdrücke, von denen zur Erinnerung hier ein paar Beispiele genügen sollen:
Muster | Bedeutung |
---|---|
/ | Wurzelknoten |
/tle | Top-Level-Element tle |
absatz | listing | Element absatz oder listing |
id('myid42') | Element mit dem Attribut id und dem Wert myid42 |
@* | Alle Attribute |
tabelle/zeile[position() mod 2 = 1] | Alle ungeraden Tabellenzeilen |
Zugegriffen wird auf solche pfadartigen Sequenzen von rechts nach links: /buch/kapitel/abschnitt ist ein Muster, das auf ein Element names abschnitt zielt, dessen Elternteil ein Element kapitel direktes Kindelement des Top-Level-Elements buch ist.
Schablonen sind genau das, was Stylesheet-Autoren schreiben müssen, um ihre Dokumente zu transformieren. Das reicht von den einfachsten, die nur festlegen, dass der Inhalt des Elements auszugeben ist über fast ebenso einfache, die ihren Inhalt in einem HTML-Element verpacken,
<!-- XML --> <emphasis>hervorgehoben</emphasis> <!-- XSLT-Template --> <xsl:template match="emphasis"> <em><xsl:value-of select="." /></em> </xsl:template> <!-- HTML --> <em>hervorgehoben</em>
bis zu recht komplexen (siehe unten). Allen gemein ist der Elementname xsl:template, und mehrere Attribute entscheiden darüber, was zu tun ist:
Solange das Template keinen Namen hat, muss über
match ein Muster vorhanden sein. Innerhalb von
Schablonen kann man andere aufrufen
: mit Hilfe von
apply-templates. Das kann entweder ein leeres
Element sein oder eins mit Inhalt:
<!-- leer --> <xsl:template match="body"> <xsl:apply-templates/> </xsl:template> <!-- mit Inhalt --> <xsl:template match="author"> <xsl:apply-templates> <xsl:sort select="vita/born/year"/> </xsl:apply-templates> </xsl:template>
Im ersten Fall sorgt apply-templates dafür, dass die Kinder des gegenwärtigen Elements (body) abgearbeitet werden. Im zweiten Fall beinhaltet apply-templates ein sort-Statement, das Autoren (author) nach ihrem Geburtsjahr sortiert.
Im XML-Quellcode sieht ein Autoreneintrag folgendermaßen aus:
<!-- Charles Baudelaire --> <author id="baudelaire"> <name> <fname>Charles-Pierre</fname> <lname>Baudelaire</lname> </name> <vita> <born><year>1821</year> <month>4</month> <day>9</day> <where> <place>Paris</place> <country>fr</country> </where> </born> <died><year>1867</year> <month>8</month> <day>31</day> <where> <place>Paris</place> <country>fr</country> </where> </died> </vita> </author>
Außer der Sortieranweisung enthält das Template für die Autorenverarbeitung noch ein apply-templates, das dafür sorgt, dass weitere Templates wie der Name verarbeitet werden. Letztlich führt das Stylesheet für einen Autor zu folgender Ausgabe (mit Hilfe weiterer, hier nicht stehender Templates für Details):
<tr> <td><span class="name"> Charles-Pierre Baudelaire </span> </td> <td align="center"><span class="year">1821</span></td> <td align="center"><span class="data">9. 4. </span></td> </tr>
Neben dem Attribut select verfügt auch apply-templates über das Attribut mode — analog zu template.
Mit Hilfe von mode ist es einfach, dieselben Elemente mehrfach anzusprechen und im Ergebnisbaum darzustellen. Der klassische Fall einer solchen Vewendung ist das Inhaltsverzeichnis eines Buches, für das die Kapitelüberschriften benötigt werden (außerdem müssen sie natürlich über den Kapiteln selbst stehen).
<!-- Aufruf eines Template mit und ohne mode --> <xsl:template match="/"> <!-- Inhaltsverzeichnis an dieser Stelle ausgeben --> <xsl:apply-templates select="//ueberschrift" mode="toc"> <!-- Rumpf des Textes hier ausgeben --> <xsl:apply-templates/> </xsl:template> <!-- Template mit mode --> <xsl:template match="//ueberschrift" mode="toc"> <!-- Hier: Behandlung der Überschriften als Inhaltsverzeichnis --> </xsl:template>
Das aufrufende Template für den Wurzelknoten (/) erzeugt zunächst ein Inhaltsverzeichnis, indem es alle Überschriften mit dem Modus toc verarbeitet und anschließend den gesamten Elementbaum (mit den darin enthaltenen Überschriften). Zur Erinnerung: die beiden Schrägstriche vor dem Elementnamen bedeuten, dass das Muster für jedes Element ueberschrift passt, gleich wo es sich in der Hierarchie befindet. Das sollte man wirklich nur so machen, wenn man weiss, dass es kein Element dieses Namens an einer Stelle gibt, die man nicht in ein solches Inhaltsverzeichnis aufnehmen will.