Extensible Stylesheet Language Transformation (XSLT)

XSLT ist eine Programmiersprache, mit der XML-Dokumente? transformiert werden können. Das Ergebnis der Transformation kann ein neues XML-Dokument oder ein Dokument eines beliebigen anderen Typs sein. XSLT stellt, neben XSL-FO und XPATH, eine Untermenge der Sprachfamilie XSL (Extensible Stylesheet Language) dar.

Geschichte

Die Entwicklung von XSL begann im August 1997, als das W3C die erste Version einer Sprache erhielt, welche die Darstellung von Inhalten eines XML-Dokuments, z. B. im Web Browser, beschreibt. XSLT wurde vom britischen Informatiker James Clark entwickelt, der auch maßgeblich an der Entwicklung der Abfragesprache XPath beteiligt war. Die erste Version von XSLT wurde am 16. November 1999 als Empfehlung der W3C herausgegeben und knapp drei Jahre später bereits, am 24. April 2002, folgte die Version 2.0.

Transformation und Komponenten

Für die Transformation eines XML-Dokumentes in ein anderes Format, werden mehrere Komponenten benötigt, durch deren Zusammenspiel ein neues Dokument entsteht.

 Test
Der XSLT-Prozessor und seine Rolle in der Transformation (nach Heinz 2004)

XSLT-Prozessor

Ein XSLT-Prozessor ist ein Programm, das die Transformation durchführt. Dazu wird das betreffende XML-Dokument, sowie ein XSLT-Stylesheet eingelesen. Das Ergebnis einer Transformation können auch mehrere Dokumente sein. Mittlerweile gibt es viele frei verfügbare wie kommerzielle XSLT-Prozessoren diverser Anbieter. Zudem besitzt jeder aktuelle Internetbrowser einen integrierten Prozessor für XSLT-Transformationen.

XSLT-Stylesheet

Das Stylesheet kann als die „Transformationsvorschrift“ bezeichnet werden, da in ihm sämtliche Anweisungen und Verarbeitungsschritte, in Form so genannter Templates, festgehalten werden, welche der XSLT-Prozessor dann auf das XML-Dokument anwendet. Das Stylesheet selbst ist ein XML-Dokument, welches grundsätzlich mit dem Wurzelelement <xsl:stylesheet> (oder <xsl:transform>), einer Versionsangabe, sowie dem dazugehörigen Namensraum begonnen wird. Letzterer kennzeichnet und definiert die Elemente und Attribute, die im Stylesheet verwendet werden, so dass der XSLT-Prozessor diese interpretieren kann.

Beispiel für den Deklarationskopf eines XSLT-Stylesheets:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

Regeln und grundlegende Sprachelemente

Templates

Templates repräsentieren Regeln, die auf einen zutreffenden Knoten im XML-Dokument angewendet werden. Ein Knoten wird mittels des Template-Attributes „match“ ausgewählt. Beispielsweise würde also der Ausdruck <xsl:template match=“Buch“> jeden „Buch“-Knoten in einem XML-Dokument ansprechen. Soll eine Template-Regel auf das gesamte XML-Dokument angewendet werden, so wird dies wird mit dem Aufruf <xsl:template match=“/“> erreicht.

Value-of

Die Anweisung value-of wird für das Auslesen eines Wertes aus einem XML-Element verwendet. Im folgenden Beispiel wird der Wert des Kind-Knotens „Autor“ zurückgegeben.

<xsl:value-of select=“Buecher/Autor“/>

For-each

Das Element for-each ist ein Schleifenelement, welches die Verarbeitung mehrerer Knoten ermöglicht. Die folgende for-each-Anweisung gibt, sofern vorhanden, den Autornamen jedes gefundenen Buch-Knotens zurück.

<xsl:for-each select=“Buecher“>
<xsl:value-of select=”Autor”/>
</xsl:for-each>

Sort

Sehr häufig ist es von Nutzen, wenn eine Liste von Namen oder Werten bei Ausgabe sortiert ist. Dies wird mit dem Element „sort“ bewerkstelligt, welches dann auf den „for-each“-Aufruf folgt. Die Schleifenanweisung aus dem obigen Beispiel wird nun, durch den Einsatz des sort-Elements, um eine aufsteigende Sortierung erweitert.

<xsl:for-each select=“Buecher“>
<xsl:value-of select=”Autor”/>
<xsl:sort select=”Autor”/>
</xsl:for-each>

If

Für die Bildung konditionaler Abfragen, stellt XSLT das “if”-Element zur Verfügung. Es können also Bedingungen formuliert werden, welche dann, im zutreffenden Fall, weitere Aktionen auslösen. Im „test“-Attribut des „if“-Elements können XPath-Ausdrücke angegeben werden. Im folgenden Beispiel würden nur die Titel der Bücher aufgelistet, die über 15,00€ kosten.

<xsl:for-each select=“Buecher“>
<xsl:if test=“Preis > 15.00“>
<xsl:value-of select=”Titel”/>
</xsl:if>
</xsl:for-each>

Choose

Die in vielen Programmiersprachen bekannte “if-else”-Abfrage ist auch in XSLT bekannt, allerdings unter den Begriffen „chosse“, „when“ und „otherwise“. Das Element „choose“ ist ein Containerelement, welches mindestens ein „when“ und ein „otherwise“ enthält. Der folgende Codeabschnitt beschreibt eine „choose“-Abfrage, in der lediglich der Autor ausgegeben wird, falls das Buch weniger als 15.00€ kostet, andernfalls wird der Autor und der Buchtitel angegeben.

<xsl:for-each select=”Buecher”>
<xsl:choose>
<xsl:when test="Preis < 15.00">
<xsl:value-of select="Autor"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="Autor"/>
<xsl:value-of select="Titel"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>

Beispiel

Dieses Beispiel beschreibt die Transformation eines XML-Dokumentes in ein XHTML-Dokument mittels XSLT. Es bedient sich dabei einiger der bereits genannten Elemente und soll deren Anwendung veranschaulichen. Das XML-Dokument beinhaltet eine Auflistung von DVDs, welche formatiert ausgegeben wird. Bei der Ausgabe erfolgt eine farbliche Unterscheidung je nachdem, ob der Artikel einen Preis von 10€ übersteigt oder nicht, das Erscheinungsjahr wird unterdrückt.

DVDS.XML
Es folgt der Inhalt des XML-Dokuments dvds.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="dvds.xsl"?>
<dvds>

<dvd>
<title>Pulp Fiction</title>
<country>USA</country>
<price>10.90</price>
<year>1994</year>
</dvd>

<dvd>
<title>Easy Rider</title>
<country>USA</country>
<price>14.79</price>
<year>1969</year>
</dvd>

<dvd>
<title>Snatch</title>
<country>GB</country>
<price>7.00</price>
<year>2000</year>
</dvd>

<dvd>
<title>Alien</title>
<country>GB, USA</country>
<price>5.55</price>
<year>1979</year>
</dvd>

<dvd>
<title>Murder by Death</title>
<country>USA</country>
<price>8.50</price>
<year>1976</year>
</dvd>

<dvd>
<title>Lord of War</title>
<country>USA</country>
<price>12.70</price>
<year>2007</year>
</dvd>

<dvd>
<title>Heat</title>
<country>USA</country>
<price>6.99</price>
<year>1995</year>
</dvd>

<dvd>
<title>The Terminator</title>
<country>USA</country>
<price>20.00</price>
<year>1984</year>
</dvd>

<dvd>
<title>Das Boot</title>
<country>GER</country>
<price>1.99</price>
<year>1981</year>
</dvd>

<dvd>
<title>Breakdown</title>
<country>USA</country>
<price>11.00</price>
<year>1997</year>
</dvd>

</dvds>

 Die Liste als XHTML
Ergebnis der Transformation

DVDS.XSL
Das XSL-Dokument übernimmt die Formatierung und Transformation:

<?xml version="1.0" encoding="UTF-8"?>

Nach der XML-Version (Ein Stylesheet ist auch ein XML-Dokument) wird die XSL Version genannt. Danach folgt der Namensraum und die Festlegung des Typs des Ausgabedokuments (output).

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"></xsl:output>

Das Template wird auf das gesamte Dokument angewendet, die Transformationsanweisungen sind in die HTML-Befehle eingebettet. Letztere dienen der Gestaltung der Tabelle und dem Design allgemein.

<xsl:template match="/">
<html>
<body>
<h2>DVD Collection</h2>
<table border="2">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Country</th>
<th>Year </th>
<th>Price</th>
</tr>

Die Schleifenroutine (for-each) wird nun auf jeden dvd-Knoten angewendet. Die Spaltenüberschriften (Titel, Land, Jahr und Preis) werden festgelegt (value-of select) und die Einträge werden nach dem Titel aufsteigend sortiert (sort).

<xsl:for-each select="dvds/dvd">
<xsl:sort select="title" order="ascending"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="country"/></td>
<td><xsl:value-of select="year"/></td>

In der folgenden Abfrage wird die Hintergrundfarbe der "Preis"-Zelle auf hellgrau geändert, wenn der Preis einen höheren Wert als 10.00 hat, anderfalls auf hellblau. Es folgen die close-Tags der XSL und der HTML-Anweisungen.

	<xsl:choose>
<xsl:when test="price > 10.00">
<td bgcolor="lightgrey">
<xsl:value-of select="price"/></td>
</xsl:when>
<xsl:otherwise>
<td bgcolor="lightblue">
<xsl:value-of select="price"/></td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>

</xsl:stylesheet>

Verändern der XML-Dokumentstruktur

Eine weitere Stärke der Transformationssprache XSLT liegt in der Möglichkeit die Struktur eines XML-Dokumentes zu verändern. Dies ist oftmals dort nötig, wo beispielsweise XML-Dokumente zwischen verschiedenen Firmen korrespondiert werden oder innerhalb eines großen Unternehmens, welches unterschiedliche Verarbeitungsmethoden anwendet. Es kann aber auch der Fall vorliegen, dass ein XML-Dokument von mehreren Applikationen bearbeitet wird, die Programme jedoch eine andere Strukturvorgabe erfordern.

Je nach Art und Umfang der Strukturmanipulation bietet XSLT verschiedene Elemente an um ein XML-Dokument umzugestalten. Obligatorisch ist jedoch der Befehl <xsl:apply-templates>, welcher die Anwendung, der Manipulationsanweisungen umsetzt. Zur Veranschaulichung sei die folgende Buchliste in XML-Form gegeben:

<Buecher>
<Buch>
<Name>Paradise Lost</Name>
<Autor>John Milton</Autor>
<Beschreibung>In Blankversen verfasstes, episches Gedicht, welches den Hoellensturz thematisiert.</Beschreibung>
<Erscheinungsjahr>1667</Erscheinungsjahr>
</Buch>
<Buch>
<Name>On the Origin of Species</Name>
<Autor>Charles Darwin</Autor>
<Beschreibung>Beschreibung der Theorie ueber die natuerliche Selektion.</Beschreibung>
<Erscheinungsjahr>1859</Erscheinungsjahr>
</Buch>
<Buch>
<Name>Das Kapital</Name>
<Autor>Karl Marx</Autor>
<Beschreibung>Eine Analyse und Kritik der kapitalistischen Gesellschaft</Beschreibung>
<Erscheinungsjahr>1867</Erscheinungsjahr>
</Buch>
</Buecher>

Das nachstehende Stylesheet sucht nun jeden Buch-Knoten in der Liste auf und legt eine Kopie von ihm an. Diese Kopie verändert den Kindknoten „Autor“ zum Attribut des Knotens „Buch“. Es bezeichnet die Knoten „Name“ in „Titel“ und „Beschreibung“ in „Details“ um und lässt das Erscheinungsjahr wegfallen. Das Ergebnis des neuen XML-Dokuments lässt sich dem Bild rechts entnehmen.


Die veränderte XML-Bücherliste

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

Anwendung auf das gesamte Dokument und Übernahme der Knotenstruktur.

<xsl:template match="/">
<Buecher>
<xsl:apply-templates select="/Buecher/Buch" />
</Buecher>
</xsl:template>\\

Anweisungen für jeden gefundenen Buch-Knoten. Zunächst wird eine Kopie des Knotens angelegt, bei welcher der ursprüngliche Knoten "Autor" in ein Attribut umgewandelt wird. Der Wert wird übernommen.

<xsl:template match="Buch">
<xsl:copy>
<xsl:attribute name="Autor">
<xsl:value-of select="Autor"/>
</xsl:attribute>\\

Die Kopie enthält einen Knoten "Titel", der den Wert des ursprünglichen Knotens "Name" erhält. Dasselbe geschieht im nächsten Schritt, unter Zuhilfenahme der Anweisung element mit "Details" und "Beschreibung".

<Titel>
<xsl:value-of select="Name"/>
</Titel>

<xsl:element name="Details">
<xsl:value-of select="Beschreibung"/>
</xsl:element>
</xsl:copy>

</xsl:template>

Wie bereits erwähnt lassen sich die Struktureingriffe auf verschiedene Arten vollführen. Im obigen Stylesheet wurden beispielsweise für die Umbenennung der Knoten (Details und Beschreibung) zwei verschiedene Methoden angewandt. Auch ist nicht immer das Anlegen einer Kopie bzw. Schablone nötig, um das gewünschte Ergebnis zu erhalten. Häufig werden die Änderungen direkt angewandt und mit <xsl:apply-templates> erzwungen. Für ausführlichere Informationen sei an dieser Stelle auf die weiterführende Literatur verwiesen.

Einsatzbereiche

Im Allgemeinen lassen sich mit Hilfe von XSLT-Transformationen zwei Einsatzgebiete definieren. Zum einen können XML-Dokumente in andere Formate, wie z. B. HTML, XHTML, PDF oder CSV transformiert werden. Dies ist in Fällen nützlich, in denen zwei Anwendungen für die Kommunikation zwar die gleichen Daten benutzen, diese jedoch unterschiedlich aufbereitet werden müssen. Auf der anderen Seite kommt XSLT in Webprojekten zum Einsatz, deren Schwerpunkt u. a. in der Präsentation von XML-Daten in HTML? liegt. Generell findet XSLT überall dort Verwendung, wo XML-Dateien oder XML-Strings anzutreffen sind oder erstellt werden können.

Quellen

  • Becher, M.: "XML", W3L GmbH Witten 2009
  • Eckstein, R., Casabianca, M.: "XML - kurz und gut", O'Reilly Verlag GmbH & Co. KG 2002
  • Gardner, J. R., Rendon, Z. L.: "XSLT & XPATH - A Guide to XML-Transformations", Prentice Hall PTR 2002
  • Heinz, D.: "Open Office XML Export", Studienarbeit, GRIN Verlag 2004
  • Kazakos, W., Schmidt, A., Tomzcyk, P.: "Datenbanken und XML", Springer-Verlag Berlin Heidelberg 2002
  • Kränzler, C.: "XML und XSL für Buch und Web", Markt+Technik Verlag 2002
  • Sebestyen, T. J.: "XML - Einstieg für Anspruchsvolle", Pearson Studium 2010
  • Sillmann, M.: "Dynamische Webseitengenerierung mit ASP.NET und XSLT", Studienarbeit, GRIN Verlag 2004
  • Simpson, J. E.: "XPath and XPointer - Locating Content in XML Documents", O'Reilly & Associates Inc. 2002
  • Skulschus, M., Kozik, J., Wiederstein, M.: "XSLT, XPATH und XQuery", Comelio GmbH 2007
  • Tidwell, D.: "XSLT - XML Dokumente transformieren", O'Reilly Verlag GmbH & Co., Mrz. 2002

Weiterführende Links:

Kategorie: XML, NoSQL, X