Deklarationskopf
Wie bei der XML-Datei muss man die XSL-Datei auch zuerst als solche kennzeichnen (das Tag muss am Ende auch wieder geschlossen werden).
Dies funktioniert mit:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
Grundsätzliches
Der Aufbau einer XSL-Datei besteht aus 2 Teilen. Der erste Teil befindet sich normalerweise in dem Aufruf des Root-Elementes. Dort wird erstmal der Grundaufbau der Seite in HTML definiert, also z.B. die Tags
<Head>
und
<Body>
(s.hierzu SelfHTML). In diesen Seitenaufbau kann man verschiedene Werte aus der XML-Datei einbinden, wie der Seitentitel usw. Der andere Teil ist der Schwierigere, aber auch der Interessantere der beiden. Hier kann man mit verschiedenen Anweisungen die von der XML-Datei abhängig gemacht werden, die Seite formatieren. Hier gibt es zum Beispiel Schleifen und Vergleiche. Während der erste Teil linear abgearbeitet wird, kommt es im zweiten Teil zu Sprüngen.
Root-Element der XSL-Datei
Die XSL-Datei sollte mit
<xsl:template match="/">
beginnen. Diese Anweisung enthält die Angaben, was der Browser machen soll, wenn das Element / aufgerufen wird. Das spezielle Zeichen "/" bezeichnet hier das Root-Element der XML-Datei, das auf jeden Fall aufgerufen wird. Dort beschreibt man dann erstmal den Aufbau der Seite. Ein Beispiel:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<Head>
<Title>
Selfxml-Testseite</Title>
</Head>
<Body>
<H1>
Ein Test</H1>
</Body>
</HTML>
</xsl:template>
</xsl:stylesheet>
Einbau von XML-Daten
Um nun den Vorteil von XML zu nutzen, will man ja auch diese Daten einbauen. Dies funktioniert mit der Anweisung
<xsl:value-of select="Element">
Das select-Attribut muss den genauen "Weg" durch die einzelnen Tags von dem aufrufenden Element (im Moment das Root-Element) zu dem gewünschten Element beschreiben. Dies sieht man am besten an einem Beispiel.
Die folgenden XSL-Beispiele beziehen sich auf nachstehende XML-Datei:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="/test.xsl" type="text/xsl" ?>
<Mitglieder>
<Verein>
Demo-Verein</Verein>
<Mitglied Id="1">
<Vorname>
Thomas</Vorname>
<Nachname>
Maier</Nachname>
<Strasse>
Hauptstrasse 12</Strasse>
<PLZ>
12345</PLZ>
<Stadt>
Stuttgart</Stadt>
</Mitglied>
<Mitglied Id="2">
<Vorname>
Michael</Vorname>
<Nachname>
Schneider</Nachname>
<Strasse>
Bahnhofsstrasse 21</Strasse>
<PLZ>
54321</PLZ>
<Stadt>
Stuttgart</Stadt>
</Mitglied>
</Mitglieder>
Nun wird aus der XML-Datei der Name des Vereins ausgelesen, und als Seitentitel ausgegeben:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<Head>
<Title> <xsl:value-of select="Mitglieder/Verein"/></Title>
</Head>
<Body>
<H1>
Ein Test</H1>
</Body>
</HTML>
</xsl:template>
</xsl:stylesheet>
Nun wollen wir eine Tabelle mit den verschieden Mitgliedern erstellen, die nicht von der Anzahl der Mitglieder abhängig ist. Dies werden wir mit einer Art Schleife erledigen. Diese wird mit
<xsl:for-each select="Mitglieder/Mitglied">
initialisiert. In unserem Beispiel wird nun für jedes Element Mitglied in der XML-Datei nun in der Tabelle mit <tr>
eine neue Zeile mit zwei Spalten mit Nach- und Vorname ausgegeben.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<Head>
<Title><xsl:value-of select="Mitglieder/Verein"/></Title>
</Head>
<Body>
<H1>
Ein Test</H1>
<table border="1">
<xsl:for-each select="Mitglieder/Mitglied">
<tr>
<td><xsl:value-of select="Nachname"/></td>
<td><xsl:value-of select="Vorname"/></td>
</tr>
</xsl:for-each>
</table>
</Body>
</HTML>
</xsl:template>
</xsl:stylesheet>
Hiermit kann man nun schon anfangen ein wenig zu spielen, ein Beispiel ist eine Sortierung der Ausgabe nach dem Nachname. Hierzu verwenden wir die von
<xsl:for-each>
angebotene Sortierfunktion. Dies funktioniert mit Angabe eines sort-Attributes. Hinweis: Da ein Tag-Elemente generell keine zwei Attribute mit dem gleichen Namen haben darf, gibt man eine zweite Sortierung durch ein Semikolon getrennt an.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<Head>
<Title><xsl:value-of select="Mitglieder/Verein"/></Title>
</Head>
<Body>
<H1>
Ein Test</H1>
<table border="1">
<xsl:for-each select="Mitglieder/Mitglied" order-by="Nachname;Vorname">
<tr>
<td><xsl:value-of select="Nachname"/></td>
<td><xsl:value-of select="Vorname"/></td>
</tr>
</xsl:for-each>
</table>
</Body>
</HTML>
</xsl:template>
</xsl:stylesheet>
Nun werden die Daten zuerst nach Nachnamen, bei gleichem Nachnamen nach dem Vornamen sortiert. Wir bekommen mit diesem Beispiel einen ersten Eindruck von den Möglichkeiten von XSL.