XSLT-Einführung
Ansichtssache

DeveloperIT-ProjekteSoftware

Neben CSS ist XSL/XSLT die zweite Möglichkeit, um XML-Daten für den Browser relativ gut darstellbar zu machen. XSL beschreibt Funktionen und Syntax für die Umwandlung von XML-Elementen in andere Elemente wie zum Beispiel HTML.

Was ist XSL/XSLT?

XSLT-Einführung

XSL steht für Extensible Stylesheet Language und beschreibt die Darstellung und Behandlung von XML-Daten mit Hilfe von XSL-Stylesheets. XSL als Sprache umfasst sowohl XSLT als Transformationssprache als auch XSL-FO als Formatierungssprache. Beide sind von XML abgeleitet und folgen damit deren Syntax und Regeln.

XSLT stellt Elemente bereit, die die Transformation (Umwandlung) von XML-Daten in Daten anderen Formats erlauben, zum Beispiel HTML und RTF. XSL-FO seinerseits stellt ? ähnlich CSS ? wiederum andere Elemente zur Verfügung, mit denen festgelegt werden kann, wie XML-Daten angezeigt werden sollen.


XSL in XML einbinden

XSLT-Einführung

XSL-Dokumente können problemlos mit einem XML-Editor erstellt und bearbeitet werden. Grundsätzlich haben XSL-Dokumente die Dateiendung XSL. Ebenso wie ein XML-Dokument muss auch ein XSL-Dokument mit der XML-Deklaration beginnen, ein root-Element (xsl:stylesheet) enthalten und wohlgeformt sein. Fertige XSL-Dokumente werden ebenso wie CSS-Dateien in XML eingebunden. Ein Beispiel:

XSL-FO beschreibt die Formatierung von XML-Dokumenten. Dies ist in etwa vergleichbar mit CSS. Im Gegensatz zu CSS wird hierbei die XML-Schreibweise verwendet, jedoch sind die Elementnamen identisch zu den Eigenschaftsnamen von CSS. Mit XSL wird zum Beispiel die Umwandlung in Formate wie PDF möglich.

XSLT funktioniert nach dem Prinzip des Dokument-Baumes. Übersetzt heißt das: Jedes Element bildet einen Knoten, von dem wiederum die Unterelemente abzweigen. Letztlich ergibt sich somit eine Art Baumstruktur. XSLT kann nun diese Knoten nacheinander abschreiten und umwandeln. Ebenso wie die Elemente können auch Attribute, Text oder Kommentare als Knoten fungieren. Durch die Umwandlung kann letztlich ein neues Dokument entstehen, worin eben das Ziel von XSLT besteht.

Grundsätzlich gibt es drei Arten der Transformation von XML-Daten in ein Format, das von einem Browser angezeigt werden kann.

– Der erste Weg besteht darin, die XML-Daten auf dem Server schon vor dem Versand an den Besucher umzuwandeln und als HTML zu speichern. Der Vorteil darin liegt in der garantierten Übertragung von HTML-Daten ? ein Nachteil ist jedoch, dass somit die Funktionsvielfalt von XSLT erheblich eingeschränkt wird. Diese Anwendung ist zum Beispiel dann denkbar, wenn Daten einmalig aus einer XML-Datenbank in HTML-Dokumente umgewandelt werden.
– Die zweite Variante besteht darin, die Daten als XML mit dem dazugehörigen XSLT-Stylesheet auf dem Server zu belassen und sie auch von diesem transformieren zu lassen.
– Die dritte Variante ist das Transformieren durch den Browser selbst. Der Browser erhält vom Server dazu die XML- und XSLT-Dokumente und kann sie dann umwandeln. Allerdings spielen hier noch nicht alle Browser mit.


Aufbau der Dokumente

XSLT-Einführung

XSLT-Dokumente beginnen mit der XML-Deklaration. Danach folgen eventuelle Processing-Instructions. Das eigentliche Dokument besteht aus einem root-Element xsl:stylesheet. Damit das Dokument als XSLT und nicht als XSL-FO-Dokument angesehen wird, muss außerdem innerhalb des Roots der Namespace xsl mit dem URL http://www.w3.org/1999/XSL/Transform definiert werden. Daraus ergibt sich folgende Grundstruktur:



xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Als Unterelemente sind folgende Top-Level Elemente erlaubt: xsl:import, xsl:include, xsl:strip-space, xsl:preserve-space, xsl:output, xsl:key, xsl:decimal-format, xsl:namespace-alias, xsl:attribute-set, xsl:
variable, xsl:param
und xsl:template.

Innerhalb von XSLT werden Templates verwendet. Ein Template ist sozusagen eine Vorlage für die Transformation von bestimmten Knoten. Diese Knoten können zum Beispiel Elemente, Attribute oder Text sein. Vorlagen werden durch das xsl:template-Element erstellt und beschrieben. Es besitzt unter anderem die Attribute match und name. Letzteres definiert einen eindeutigen Namen für das Template. Dieser kann später weiter verwendet werden. Mit dem match-Attribut wird exakt spezifiziert, auf welche Knoten der Quell-Datei diese Vorlage angewandt werden soll. Die Werte dieses Attributs werden als Pattern bezeichnet.

Gelangt der XSLT-Parser zu einem Knoten, für den ein Template definiert wurde, ersetzt er diesen Knoten durch das Template. Innerhalb des Templates können dazu weitere XSLT-Angaben oder auch Text oder Markup folgen.


Verschachtelung von Elementen

XSLT-Einführung

Der Inhalt von B wird ausgelassen, stattdessen
folgt der Inhalt von C:

""


Include und Import

XSLT-Einführung

Es gibt zwei Wege, um in einem XSLT-Dokument die Angaben eines anderen verwenden zu können. Im ersten Fall benutzt man dazu das xsl:include-Element. Als Wert des href-Attributs erhält dies den URL der zu verwendenden Datei. Diese wird eingelesen und die enthaltenen Angaben werden in das aktuelle Dokument eingebunden. Im zweiten Fall benutzt man das xsl:import-Element. Auch hier wird das href-Attribut mit dem jeweiligen URL definiert. Der Unterschied zu xsl:include besteht darin, dass die Regeln des importierten Stylesheets Vorrang vor denen aus dem eigentlichen Dokument haben.

XSLT bietet zum Erzeugen der Resultate vorgefertigte Lösungen, so genannte Elemente. Diese können angewandt werden, um eine saubere Syntax des Resultat-Dokuments zu erhalten oder um Knoten erzeugen zu können, die innerhalb der Quelle schon verwendet wurden. Elemente werden mit xsl:element erzeugt. Es besitzt die Attribute name (Name des Elements), namespace (Namensraum des Elements) sowie use-attribute-sets (Name einer zu verwendenden Attributliste). Der Name sollte unbedingt definiert werden. Innerhalb des xsl:element-Elements können beliebige Informationen folgen, zum Beispiel Text, Markup oder Kommentare. Ein Beispiel:


Das ist mein Element.

erzeugt:
Das ist mein Element.


Attribute erzeugen

XSLT-Einführung

Ebenso wie Elemente erzeugt werden können, ist es natürlich auch möglich, diesen Attribute zuzuweisen. Dazu verwendet man das xsl:attribute-Element. Es erhält als Wert des name-Attributs den zu verwendenden Namen sowie gegebenenfalls einen Namespace (namespace-Attribut). Innerhalb des Elements wird der Wert des erzeugten Attributs notiert.

Attributlisten dienen dazu, häufig verwendete Attribute schneller verwenden zu können, indem man sie einem Element eben nur über das use-attribute-sets-Attribut zuweisen braucht und nicht jedes Mal neu definieren muss. Attributlisten werden durch das xsl:attribute-set-Element definiert. Außerdem müssen sie durch das name-Attribut mit einem Namen versehen werden, der dann von Elementen verwendet werden kann.


Texte und Kommentare

XSLT-Einführung

Neben Elementen und dazugehörigen Attributen können auch Texte, Processing-Instructions oder Kommentare erzeugt werden.

Neben der Möglichkeit, mit xsl:text statisch Text erzeugen zu können, bietet XSLT die Voraussetzungen, Text durch den Parser erstellen zu lassen. Dazu wird das xsl:value-of-Element im Zusammenhang mit dessen select-Attribut verwendet. Tritt dieses auf, wird der Wert des durch select beschriebenen Knotens an dieser Stelle eingefügt. Ein Beispiel:


heisst:




erzeugt:

Er heisst: Max Mustermann.


Abläufe definieren

XSLT-Einführung

XSLT bietet neben dem simplen Einfügen von Code in bestimmte Vorlagen (templates) die Möglichkeit, quasi Programmabläufe zu definieren. Um Elemente des Quellbaums in das Resultat zu übernehmen, kopiert man sie mit Hilfe des xsl:copy-Elements. Es kann innerhalb von Templates verwendet werden und veranlasst, dass der aktuelle Knoten in das Resultat kopiert wird. Ein eventueller Namespace wird dabei übernommen, jedoch keine Attribute oder Unterelemente. Außerdem steht wiederum das bereits bekannte use-attribute-sets-Attribut zur Verfügung.

Außerdem besteht eine zweite Möglichkeit des Kopierens mit xsl:copy-of. Dieses Element kopiert im Gegensatz zu xsl:copy den gesamten mit select definierten Knoten inklusive Unterknoten aus dem Quell-Dokument in das Resultat-Dokument.

Unter Umständen ist es notwendig, bestimmte Abläufe oder Knoten innerhalb eines Templates in einer gewissen Reihenfolge durchlaufen zu lassen. Dazu verwendet man das xsl:for-each-Element. Es erhält als Wert des select-Attributs ein Pattern. Wird das xsl:for-each-Element aufgerufen, so wird der enthaltene Inhalt so oft in das Resultat geschrieben, wie das Pattern in dem für das Template definierte Element auftritt.


Bedingte Abschnitte

XSLT-Einführung

Innerhalb von XSLT gibt es die Möglichkeit, Transformationen nur dann auszuführen, wenn eine bestimmte Bedingung erfüllt ist. Dazu wird das xsl:if-Element verwendet. Die Bedingung wird als Wert des test-Attributs notiert. Ergibt dieser true, wird der Inhalt des Elements in das Resultat-Dokument übernommen.

Wenn die Auswahl durch xsl:if nicht mehr ausreicht oder zu umständlich wird, kann dieses Element durch drei andere Elemente ersetzt werden: xsl:choose, xsl:when und xsl:otherwise. Ähnlich wie in anderen Programmiersprachen wird so eine Mehrfachauswahl definiert. Die gesamte Auswahl wird von xsl:choose umschlossen. Darin enthalten sind xsl:when und xsl:otherwise. Das xsl:when-Element beschreibt mit Hilfe des test-Attributs eine Bedingung. Ist diese erfüllt, wird der Inhalt des Elements in den Resultat-Baum übernommen. Die anderen Bedingungen werden dann nicht weiter betrachtet und der Parser schreitet mit dem nächsten Knoten nach dem schließenden xsl:choose-Tag fort. Ist die Bedingung nicht erfüllt, schreitet der Parser zum nächsten xsl:when weiter und prüft diese. Wurde auch die letzte Bedingung nicht erfüllt, wird schließlich der Inhalt des xsl:otherwise-Elements übernommen.

Die Reihenfolge von Daten ist zum Beispiel besonders bei langen, unübersichtlichen Listen sehr wichtig. Das Sortieren der Daten kann mit XSLT bestimmt und beeinflusst werden. Wird das Element xsl:sort definiert, so besagt es, dass die einzufügenden Inhalte vorher zu sortieren sind. Durch die Attribute select, data-type, lang, order und case-order kann die Sortierung näher bestimmt werden.


Variablen und Parameter

XSLT-Einführung

Wenn innerhalb des gesamten Dokuments ein bestimmter Text immer wieder auftritt oder es Schwierigkeiten mit dem Erstellen von Attributen gibt, können Variablen zum Einsatz kommen.

Diese definiert man mit Hilfe des xsl:variable- oder xsl:param-Elements. Beide funktionieren in etwa gleich: Als Wert des name-Attributs wird der Variablen-Name definiert und innerhalb des Elements der Wert. Dieser kann aus fast allen beliebigen Inhalten bestehen: Text, Markup et cetera. Einziger Unterschied der beiden ist, dass der Wert von xsl:param als Standardwert gilt; wenn das Template oder Stylesheet aufgerufen wird, in dem das xsl:param-Element auftritt, können die Parameter (xsl:param) als Standardwerte verwendet werden.

Um die Werte nun wiederum abzurufen, wird xsl:value-of (beziehungsweise { und }) benutzt und diesem ein Dollar-Zeichen ($) sowie der Variablen-Name übergeben. Beispiel für eine solche Variablen-Definition:

@Name="Max Mustermann"

gibt als Ergebnis den Inhalt des Kunden mit dem Namen Max Mustermann aus.

Um Parameter innerhalb eines Templates verwenden zu können, müssen diese an das jeweilige Template übergeben werden. Dies geschieht mittels des xsl:with-param-Elements, welches als Attribut den Namen des Parameters erhält. Wird es aufgerufen, so übergibt es den Wert des Parameters an die gleichnamige Variable.