XML und XSLT programmieren

Mit Hilfe der Extensible Stylesheet Language (XSL) verwandeln sich öde XML-Dokumente in schicke HTML-Dateien. Alles, was Sie dazu brauchen sind ein paar Grundkenntnisse der XSLT-Syntax (XSL Transformations) und das passende Werkzeug.

Dieser Beitrag ist im Herbst 2004 in der Chip-Sonderheftreihe “Chip Professionell” erschienen.

Eine XSLT-Datei ähnelt auf den ersten Blick einem HTML-Dokument. XSLT steht für XSL-Transformations, den Teil der Sprache, die für die Umwandlung von Dokumenten zuständig ist. Und in der Tat: In einer XSLT-Vorlage stecken häufig HTML-Tags, zwischen die später wiederum die Daten aus dem XML-File eingebaut werden. Natürlich können Sie auch beliebige andere Tags verwenden, und so eine XML-Datei in eine andere umwandeln.

Im Normalfall jedoch werden Sie es mit HTML zu tun haben, genauer gesagt mit XHTML. Diese Variante der Seitenbeschreibungssprache drückt die HTML-Anweisungen in XML aus. Sprich: der HTML-Code muss „well formed“ sein.

Das passende Werkzeug für erste Tests mit XML und XSL haben Sie bereits auf Ihrem Windows-Computer. Der Internet Explorer kann XML-Dateien und die Vorlage verknüpfen, mit Mozilla geht’s auch. Ein in die Browser eingebauter Stylesheet-Prozessor erzeugt aus XML und XSL eine hübsche Seite. Für einen ersten Blick auf das Ergebnis reicht das. Im letzten Kapitel dieses Beitrags lernen Sie außerdem das Programm Saxon kennen, einen XSL-Prozessor, der aus XML und XSL schickes XHTML bastelt und speichert.

Der erste Test

Ran an die Arbeit. Schreiben Sie zunächst eine XML-Datei mit diesem Inhalt:

<?xml version='1.0' encoding='ISO-8859-1'?>

<?xml-stylesheet type='text/xsl' href='buecher.xsl'?>

<werke>

<buch>

<titel>Ich bin ein Berliner</titel>

<autor>John F. Kennedy</autor>

<seiten>133</seiten>

<preis>12.80</preis>

</buch>

<buch>

<titel>Ich auch</titel>

<autor>Hubert Meyer</autor>

<seiten>422</seiten>

<preis>69.90</preis>

</buch>

<buch>

<titel>Wo ist Berlin</titel>

<autor>Hans Dampf</autor>

<seiten>152</seiten>

<preis>29.90</preis>

</buch>

<buch>

<titel>Ich bin a Münchener</titel>

<autor>Hias Dimpfelmoser</autor>

<seiten>152</seiten>

<preis>225.80</preis>

</buch>

</werke>

 Wichtig ist die zweite Zeile: <?xml-stylesheet…>. Sie teilt später dem Internet Explorer mit, wo er die zugehörige XSL-Datei finden kann. Speichern Sie die XML-Datei unter dem Namen „buecher.xml“ auf Ihrem Desktop.

Im Folgenden geht es darum: Die XSL-Vorlage gestaltet ein HTML-Gerüst. In dieses Gerüst fügt sie die XML-Daten aus dem gerade geschriebenen File ein.

Bauen Sie ein erstes, einfaches XSL-File. Das sieht so aus:

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

<xsl:template match="werke">

<html>

<head><title>Titelliste</title></head>

<body>

<table border="1">

<xsl:apply-templates/>

</table>

</body>

</html>

</xsl:template>

</xsl:stylesheet>

 In der ersten Zeile des Listings legen Sie die Art der Vorlagendatei fest. Übernehmen Sie diese in jede XSL-Datei. Danach geht es mit der ersten Vorlage los. Sie beginnt mit <xsl:template. Darauf folgt der Parameter match=“werke“. Für den Prozessor bedeutet das: Diese Vorlage trifft auf das root-Element werke zu. In der Vorlage für das root-Element steht im Allgemeinen das Grundgerüst der HTML-Datei, also Titelzeile, Body und in diesem Fall ein Tabellenrahmen. Sie dürfen innerhalb eines Templates beliebige XHTML-Tags verwenden – sie müssen aber syntaktisch korrekt sein. Ein normales <br> würde der XSL-Prozessor ablehen, erst bei <br /> ist alles ok. Ebenso müssen die Werte von Parametern wie bei border=”1″ in Anführungszeichen stehen.

Unter dem <table>-Tag steht <xsl:apply-templates/>. Das bedeutet für den Prozessor: Wende alle verfügbaren Templates auf die Elemente unterhalb von werke an. Im Moment sind aber noch keine solchen Templates vorhanden. Deswegen kippt der Prozessor einfach alle vorhandenen Daten in die Tabelle. Im Browser sieht das noch nicht sehr gut aus — aber immerhin ist ein Anfang gemacht.

Beachten Sie, dass Sie jedes Template auch wieder mit </xsl:template> abschließen. Ganz unten im Listing finden Sie außerdem den Abschluss für die XSL-Datei: </xsl:stylesheet>. Speichern Sie die XSL-Datei unter dem Namen buecher.xsl.

Weitere Vorlagen

Natürlich kann das simple Template niemanden zufrieden stellen. Abgesehen davon kommt kein vernünftiger HTML-Code dabei heraus. Also braucht die XSL-Datei noch Anweisungen für Tabellenzeilen und für die einzelnen Zellen. Zunächst die Zeilen. Die ordnen Sie dem Zweig buch zu. Denn jedes buch enthält die Detaildaten, die dann später in den Tabellenzellen angezeigt werden.

Für die Zeilen zuständig ist der Eintrag:

<xsl:template match="buch">

<tr>

<xsl:apply-templates/>

</tr>

</xsl:template>

Hier stehen <tr>-Tags für Anfang und Ende einer Tabellenzeile. Innerhalb dieses Tags finden Sie wieder die Anweisung, nach der erneut Stilvorlagen angewandt werden sollen. In der XSL-Datei geht es weiter mit:

<xsl:template match="titel|autor|seiten|preis">

<td>

<xsl:value-of select="."/>

</td>

</xsl:template>

Unterhalb des Knotens buch gibt es die Elemente titel, autor, seiten und preis. Jedes dieser Elemente soll in der gleichen Weise dargestellt werden. Deswegen definieren Sie für alle vier ein gemeinsames Stylesheet. Damit der Stylesheet-Prozessor versteht, was Sie wollen, tippen Sie hinter match die Element-Namen ein, jeweils getrennt mit einem senkrechten Strich. Der Strich steht für eine ODER-Verknüpfung. Die Vorlage gilt also für titel oder für autor oder für seiten oder für preis.

Die Werte selbst erzeugt value-of select=“.“. Diese Anweisung bedeutet: Nimm den Wert des aktuellen Knotens und füge ihn ein. Achten Sie beim Ergänzen der Datei darauf, dass die neuen Templates vor dem abschließenden </xsl:stylesheet> eingebaut werden müssen. Damit ist das erste, einfache Stylesheet fertig.

Mehr aus dem Stylesheet holen

Natürlich kann es nicht der Weisheit letzter Schluss sein, alle Daten aus der Liste in einer farblosen Tabelle anzuzeigen. Bringen Sie Farbe ins Spiel. Dazu ergänzen Sie das Stylesheet um diese Zeilen:

<xsl:template match="preis">

<td style="background:yellow">

<xsl:value-of select="."/>

</td>

</xsl:template> 

Diese Vorlage gilt nur für Einträge des Knotens preis. Dementsprechend müssen Sie die Zeile

<xsl:template match="titel|autor|seiten|preis">

aus der vorhergehenden Vorlage ändern in

<xsl:template match="titel|autor|seiten">

Zu jedem Element preis erzeugt unser Template eine Tabellenzelle mit der Stylesheet-Information background:yellow. Sprich, der Zellhintergrund erscheint gelb gefärbt.

Oder sollen vielleicht nur Preise gefärbt erscheinen, die besonders günstig sind? Die Schnäppchen-Funktion sieht so aus:

<xsl:template match="preis">

<td>

<xsl:if test=". < 20">

<xsl:attribute name="style">background:green;color:white</xsl:attribute>

</xsl:if>

<xsl:if test=". > 100">

<xsl:attribute name="style">background:red;color:white</xsl:attribute>

</xsl:if>

<xsl:value-of select="."/>

</td>

</xsl:template>

Im Grunde ist hier nur die Vorlage für preis ein wenig erweitert worden. Hinzu gekommen sind zwei if-Anweisungen und ein neues Element namens <xsl:attribute>. Aber der Reihe nach. Mit <xsl:if> überprüft das Stylesheet eine Bedingung. Die ist im Parameter test festgelegt und heißt: . < 20. Statt des < setzt der Prozessor später das Kleiner-Zeichen < ein. An Stelle des Punkts nimmt er das aktuell gewählte Element. Zu Deutsch also: Wenn das aktuelle Element, der preis, kleiner als 20 ist, trifft die Bedingung zu.

Da bereits vorher das HTML-Tag <td> geschrieben wurde, muss nun der Parameter zum Färben der Zelle hinzugefügt werden. Das geht – überraschend einfach – mit <xsl:attribute>. Im Parameter name steht der Name des Parameters, der später in das umgebende Element — also <td> eingefügt wird. Insgesamt heißt das:

Wenn der Preis kleiner als 20 ist, füge zum HTML-Tag <td> den Parameter style hinzu und gib ihm den Wert background:green;color:white. Ist das der Fall, entsteht der HTML-Code:

<td style="background:green;color:white">12.80</td> 

Dasselbe Spiel findet statt, wenn der Preis über 100 liegt. Dann wird der Preis rot eingefärbt. Denn das ist kein Schnäppchen mehr.

Übrigens: Eine beliebte Fehlerquelle bei Vergleichen: Sind Zahlen mit Kommata statt mit Punkten getrennt, erkennt die Software keine Zahl. Schreiben Sie deshalb immer 12.80 statt 12,80.

Unsortierte Ausgabe

Ausgabe sortieren

Sie möchten noch etwas mehr Ordnung in Ihre Daten bringen? Kein Problem: sortieren Sie die Tabelle. Dazu müssen Sie die ersten Zeilen im Template zwischen <xsl:template match=”werke”> und </xsl:template> ein wenig umbauen. Aus <xsl:apply-templates /> wird:

<xsl:apply-templates>

<xsl:sort select="seiten" />

</xsl:apply-templates>

Dem <xsl:sort> geben Sie ein Element mit auf den Weg, nach dem sortiert wird. Statt der seiten funktioniert natürlich auch titel oder autor. Der Rest des Stylesheets bleibt wie gehabt — das Ergebnis ändert sich aber: Die Daten erscheinen sauber sortiert.

Sortierte Ausgabe

Übrigens: Falls Sie nach mehreren Kriterien sortieren wollen, schreiben Sie die einfach untereinander, zum Beispiel:

<xsl:apply-templates>

<xsl:sort select="seiten" />

<xsl:sort select="titel" />

</xsl:apply-templates>

Auf diese Weise bekommen Sie auch Überblick in umfangreiche und komplexe Tabellen.

Saxon macht HTML

Der XSL-Prozessor Saxon macht aus XML-Dateien HTML. Das Programm gibt es unter http://prdownloads.sourceforge.net/saxon/saxon6_5_3.zip zum Download. Da Windows XP keine Java-Virtual-Machine eingebaut hat, ist der Aufruf des Programms etwas knifflig:

java -jar saxon.jar meindat.xml meindat.xsl > meindat.html

Zunächst startet der Befehl die Java Engine. Die bekommen Sie unter http://java.sun.com. Danach wird das Programm saxon.jar geladen, das als ersten Parameter die XML-, als zweiten die XSL-Datei mit auf den Weg bekommt. Mit dem >-Zeichen gelangt das Ergebnis in die HTML-Datei. Die kann direkt im Browser verwendet werden.

Praktisch ist das bei Informationen, die sich gelegentlich ändern: Sie bekommen die Daten als XML, wandeln Sie mit Saxon um und laden die resultierende HTML-Datei auf den Server.

 

XSL-Datei buecher1.xml

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

<xsl:template match="werke">

<html>

<head><title>Titelliste</title></head>

<body>

<table border="1">

<xsl:apply-templates>

<xsl:sort select="seiten" />

</xsl:apply-templates>

</table>

</body>

</html>

</xsl:template>

<xsl:template match="buch">

<tr>

<xsl:apply-templates/>

</tr>

</xsl:template>

<xsl:template match="titel|autor|seiten">

<td>

<xsl:value-of select="."/>

</td>

</xsl:template>

<xsl:template match="preis">

<td>

<xsl:if test=". < 20">

<xsl:attribute name="style">background:green;color:white</xsl:attribute>

</xsl:if>

<xsl:if test=". > 100">

<xsl:attribute name="style">background:red;color:white</xsl:attribute>

</xsl:if>

<xsl:value-of select="."/>

</td>

</xsl:template>

</xsl:stylesheet>

Ähnliche Beiträge