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>
Statt des Bezugs zum europäischen Latin1-Zeichensatzes auch UTF-8 und UTF-16 stehen kann ( die letzten beiden muss jeder XSL-Prozessor unterstützen).
Stylesheets sind selbst XML-Dokumente. Sie enthalten daher an ihrem Anfang eine Processing Instruction, die die XML-Version und hier, den Zeichensatz definiert. Außerdem legt das Wurzelelement xsl:stylesheet, das dem Namensraum xsl angehört, fest, dasss der XSL-Namensraum der von XSLT in der Version 1 ist. Innerhalb dieses Wurzelelements können eine Reihe sogenannter Top-Level-Elemente vorkommen.
Wenn man XML in HTML wandeln will, muss man dies ebenfalls über den Namensraum kundtun:

<?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"?>
<?xml-stylesheet href="person.xsl" type="text/xsl" ?>

<!-- Rest des XML-Dokuments -->

 

Beispiel

Beispiel DTD

Beispiel XML-Datei

Beispiel XSL-Datei