Extensible Stylesheet Language (XSL)
Mit XSL(T) - Extensible Stylesheet Language (Transformation) - wurde eine Sprache
geschaffen, mit deren Hilfe die Umwandlung eines XML-Dokuments von einer Struktur
in eine andere möglich sein soll.
Drei Bestandteile hat XSL:
# Eine Sprache zur Umwandlung von XML-Dokumenten (XSLT)
# XML-Sprachelemente zur Formatierung (XSL)
# Eine Syntax zur Adressierung eines bestimmten Teildokuments (XPATH)
XSL beschreibt einem logischen Prozessor, wie er eine Struktur in eine andere
umwandeln soll. Die Aufgabe wird innerhalb von XSL, wie oben dargestellt, auf
mehrere Komponenten aufgeteilt, dass die Sprache auch unabhängig von XSL
eingesetzt werden kann. Eine Transformation, die mit XSLT ausgedrückt wird,
beschreibt die Umwandlung eines Dokumentquellbaums (source tree) in einen Ergebnisbaum
(result tree). Eine solche Transformation wird auch Stylesheet - a) aus historischen
Gründen (auch DSSSL hieß Stylesheet-Sprache) und b) weil sie schlicht
Formatierungsanweisungen für XSL generieren kann - genannt. Bei einer XSL-Transformation
liest der Prozessor sowohl das XML-Dokument als auch das zugehörige XSL-Stylesheet.
Basierend auf den Informationen, die der Prozessor im XSL-Stylesheet findet,
generiert er ein neues XML-Dokument oder Teile davon. Außerdem ist auch
eine Umwandlung von XML in HTML vorgesehen. Mit ein wenig zusätzlichem
Aufwand läßt sich auch eine eigenständige Textdatei generieren,
wobei das Hauptaugenmerk auf der Umwandlung XML zu XML liegt.
Der Mantel eines solchen Stylesheet sieht wie folgt aus:
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"> <!-- Rest des Stylesheets --> </xsl:stylesheet> |
<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0" xmlns="http://www.w3.org/TR/REC-hml40" result-ns=""> <!-- Rest des Stylesheets --> </xsl:stylesheet> |
Die kein Präfix enthaltene xmlns-Zuweisung auf die HTML-Recommendation und der Zusatz result-ns="" sorgen dafür, dass Elemente ohne Präfix als Bestandteil des HTML-Namensraums gelten. Für alle anderen müsste, wie für XSL selbst, ein Namensraum-URI existieren und per xmlns:myns referenziert sein.
Stylesheets sind eine Ansammlung von Vorlagenregeln (template rules),
die jeweils aus zwei Teilen bestehen:
# Muster (pattern)
# Schablone (template)
Das Muster beschreibt, welche Quellknoten (Elemente) von der Regel verarbeitet
werden soll. Die Schablone beschreibt die XML-Struktur, die erzeugt werden soll,
wenn Knoten gefunden werden, die mit dem Muster übereinstimmen.
Während XSLT es erlaubt ausgeklügeltes Pattern Matching auszuführen,
benutzen viele Musterregeln einfach nur das Element im XML, auf welches das
Template angewendet werden soll.
Wenn HTML die Zielsprache ist, besteht die Ausgabe typischerweise aus einer
Serie von HTML-Tags, die den Wert und/oder die Attribute des XML-Knotens umgeben,
auf den das Template angewendet wurde.
Die folgende Abbildung zeigt, wie XML- und XSLT-Dokumente in einen XSLT-Prozessor
gefüttert werden. Die Ausgabe des Prozessors ist ein HTML-Dokument, das
jeder anständige Browser darstellen kann.
Eine XSLT-Transformationsmaschine kombiniert XML und XSLT, um HTML zu generieren.
Der XSL-Prozessor vergleicht das Muster mit den Knoten im Quellbaum, und die
Schablonen dienen der Generierung des Ergebnisbaums. Dabei berücksichtigen
Prozessoren nur Elemente, für die in einer solchen Vorlage Anweisungen
existieren. Eine einzelne Schablone kann bereits eine komplexe Struktur erzeugen,
es können auch viele zur Komplexität des resultierenden Dokuments
beitragen.
Handelt es sich bei den zugrunde liegenden XML-Daten um tief verzweigende/strukturierte,
kann auch das Stylesheet umfangreich und komplex sein. Nicht nur deshalb sieht
das W3C vor, dass man in Stylesheets andere referenzieren kann. Das ist auf
zweierlei Weise möglich:
<xsl:import href="..."/>
<xsl:include href="..."/>
In beiden Fällen ersetzt der Stylesheet-Prozessor die Referenz durch den
Inhalt der inkludierten Datei, mit einem Unterschied: Bei Überschneidung
entscheidet bei import das importierende Stylesheet, welche Regeln Priorität
haben. Im Falle von include gelten die Konfliktlösungsregeln, die die Spezifikation
vorsieht.
XSLT ermöglicht im Prinzip beliebige Transformationen. Aus der Rechnung
von Firma A kann ein Stylesheet beispielsweise eine Struktur erzeugen, auf die
sich A und Firma B geeinigt haben, um solche Daten auszutauschen. Firma B wiederum
muss möglicherweise das Zwischenformat erst wieder in die hauseigene Struktur
wandeln - ohne dass die Integrität der Daten darunter leidet. Die Bedeutung
der Information bleibt erhalten. Genau die geht bekanntlich verloren, wenn man
HTML erzeugt.
In einem XSL-Stylesheet wird eine Vorrangregel durch ein xsl:template-Element
dargestellt. Das Muster ist durch den Wert des zum Element xsl:template gehörenden
Attributs match und die passende Schablone durch den Inhalt des Elements dargestellt.
Einfaches Suchmuster:
<xsl:template match="books"> <!-- Beschreibung der Formatierung für Bücher --> </xsl:template> |
Daten ermitteln:
An den Dateninhalt eines Elements gelangt man mit Hilfe der Anweisung xsl:value-of.
Es verfügt über ein Attribut select, bei dem es sich um ein Muster
handelt. Falls dieses Muster einen einfachen Elementtyp benennt, dann wird es
mit einem Unterelement des aktuellen Elements übereinstimmen.
Beispiel DTD Beispiel
XML Datei
<xsl:template match="buch">
<h1><xsl:value-of select="titel"/></h1>
</xsl:template>
In diesem Fall ist das aktuelle Element das Element buch.Bei diesem Element
handelt es sich um dasjenige, das mit dem match-Attribut übereinstimmt.
Ausgegeben wird der Dateninhalt des Kindknotens titel.
Der Dateninhalt des jeweiligen aktuellen Elements wird mit Hilfe folgender Anweisung
ausgegeben:
<xsl:value-of select="." />
Die Anweisung apply-templates
Das Tag <xsl:apply-templates> in einem XSLT-Stylesheet fordert den XSLT-Prozessor
auf, mit den Kinderknoten des aktuellen Elements fortzufahren, wenn es selbst
abgearbeitet wurde.
<xsl:template match="titel"> <B><xsl:apply-templates/></B> </xsl:template> |
Dieses Beispiel verarbeitet die Kind-Elemente des ausgewählten Elements
<titel>, nachdem das Tag bold auf das aktuelle Element angewendet worden
ist. Man kann auch optinal das Attribut select verwenden, um zu entscheiden,
welche Kind-Elemente bearbeitet werden sollen.
<xsl:apply-templates select="abschnitt"/>
XSL in eine XML Datei einbinden:
Um ein XSL-Stylesheet auf ein XML-Dokument anzuwenden, muss man dies explizit
im XML-Dokument angeben. Folgender Code veranlaßt, dass das XML Dokument
mit Hilfe des "person.xsl"-Stylesheet dargestellt werden soll:
<?xml version = "1.0"?> |
Beispiel
Beispiel DTD
Beispiel XML-Datei
Beispiel XSL-Datei