XSL Transformations
XSLT-Beispiel
Dateiendung: .xsl, .xslt
MIME-Type: application/xslt+xml[1]
Entwickelt von: World Wide Web Consortium
Art: Stylesheet-Sprache
Erweitert von: XML
Standard(s): 1.1 (Recommendation),
2.0 (Recommendation)
3.0 (Recommendation)
www.w3.org/TR/xslt


XSL Transformation, kurz XSLT, ist eine Programmiersprache zur Transformation von XML-Dokumenten. Sie ist Teil der Extensible Stylesheet Language (XSL) und stellt eine universelle (Turing-vollständige)[2] Sprache dar.

XSLT wurde vom World Wide Web Consortium (W3C) am 8. Oktober 1999 als Empfehlung veröffentlicht.[3] XSLT baut auf der logischen Baumstruktur eines XML-Dokumentes auf und dient zur Definition von Umwandlungsregeln. XSLT-Programme, sogenannte XSLT-Stylesheets, sind dabei selbst nach den Regeln des XML-Standards aufgebaut.

Die Stylesheets werden von spezieller Software, den XSLT-Prozessoren, eingelesen, die mit diesen Anweisungen ein oder mehrere XML-Dokumente in das gewünschte Ausgabeformat umwandeln. XSLT-Prozessoren sind auch in vielen modernen Webbrowsern integriert, wie zum Beispiel Opera (ab Version 9), Firefox und Internet Explorer Version 5 (ab Version 6 mit vollständiger XSLT-1.0-Unterstützung).

XSLT ist eine Untermenge von XSL, zusammen mit XSL-FO und XPath.

Geschichte

[Bearbeiten | Quelltext bearbeiten]

Ursprünglich sollte mit XSL eine DSSSL-artige Sprache in XML-Syntax entstehen. Schnell war jedoch klar, dass eine solche Sprache eigentlich aus drei interagierenden, aber unabhängig voneinander einsetzbaren Teilen besteht:

Die deklarative, funktional-applikative Sprache XSLT ist u. a. aus DSSSL hervorgegangen. Entwickelt wurde XSLT ursprünglich von James Clark (XSLT 1.0, XSLT 1.1), für die derzeitige Weiterentwicklung ist Michael Kay verantwortlich. Seit dem 23. Januar 2007 ist XSLT 2.0 eine „Recommendation“ (Empfehlung) des W3C und hat damit die seit 1999 gültige Version XSLT 1.0 abgelöst. Inzwischen existiert auch eine Version XSLT 3.0[4] als Candidate Recommendation vom November 2015 des W3C, welche bereits durch den Saxon-Parser unterstützt wird.[5]

Funktionsweise

[Bearbeiten | Quelltext bearbeiten]
Vereinfachte Darstellung der Funktionsweise von XSLT – Ein XML-Dokument wird mittels eines XSLT-Dokuments und eines verarbeitenden Prozessors in ein neues Dokument überführt (.xml, .xhtml, .html, .txt, …).

Die Sprache XSLT beschreibt die Umwandlung eines XML-Derivats (auch XML-Dialekt oder XML-Anwendung genannt), in Form eines XML-Dokuments, in ein anderes Dokument, Transformation genannt. Das resultierende Dokument entspricht meist der XML-Syntax, es können aber auch andere Textdateien und sogar Binärdateien erstellt werden.

Dazu werden die XML-Dokumente als logischer Baum betrachtet: Die Quellbäume der zu transformierenden Dokumente und die durch die Transformation entstehenden Zielbäume der zu erzeugenden Dokumente.

Eine Transformation besteht aus einer Reihe von einzelnen Transformationsregeln, die Templates (deutsch „Schablonen“) heißen. Ein Template besitzt ein auf XPath basierendes Pattern (deutsch „Muster“), das beschreibt, für welche Knoten es gilt, und einen Inhalt, der bestimmt, wie das Template seinen Teil des Zielbaums erzeugt.

In einem XSLT-Dokument kommen also an Sprachen und XML-basierten Technologien mindestens vor:

Sowie ab XSLT 2.0:

Template Rules und Conflict Resolution

[Bearbeiten | Quelltext bearbeiten]

Template Rules (deutsch „Schablonen-Regeln“) werden immer dann angewendet, wenn eine bestimmte Bedingung passt. Das folgende Beispiel schließt den Inhalt aller Titel („title“-Tags) in „em“-Tags ein, egal wo sie im Dokument vorkommen, und lässt den Rest unberührt.

<xsl:template match="//title">
  <em>
    <xsl:apply-templates/>
  </em>
</xsl:template>

<xsl:apply-templates/> transformiert die Kindelemente des aktuellen Elements mittels sämtlicher dafür anwendbarer Regeln.

Conflict Resolution (deutsch „Konfliktauflösung“) wird dann benötigt, wenn ein Knoten zu mehreren Template Rules gleichzeitig passt. In solchen Fällen gelten die folgenden Regeln.

Sortierung und bedingte Ausgabe

[Bearbeiten | Quelltext bearbeiten]

Um Elemente zu sortieren, kann ein Tag for-each mit einem sort kombiniert werden. Die Schleife läuft dann nicht in der Reihenfolge der Knoten des Originaldokuments, sondern in alphabetischer oder numerischer Reihenfolge. Im folgenden Beispiel werden alle Buch-Elemente aufsteigend nach ihrem Preis sortiert.

<xsl:for-each select="buch">
  <xsl:sort select="preis" order="ascending" />
</xsl:for-each>

Mit oder ohne order="ascending" ist die Reihenfolge immer die gleiche (aufsteigend), da dies die Default-Einstellung ist. Mit order="descending" erhält man eine absteigende Reihenfolge.

XSLT bietet sowohl binäre Entscheidungen mittels des Tags if als auch mehrfache Entscheidungen über das Tag choose. Das folgende Beispiel gibt genau dann ein Sternchen aus, wenn das Attribut nationality des Elements author den Wert „U.S.“ hat.

<xsl:if test="author/@nationality='U.S.'">*</xsl:if>

Um mehrere Fallunterscheidungen zu treffen, kann die Kombination aus den Tags choose und when verwendet werden.

<xsl:choose>
  <xsl:when test="...">...</xsl:when>
  <xsl:when test="...">...</xsl:when>
  <xsl:when test="...">...</xsl:when>
  <xsl:otherwise>...</xsl:otherwise>
</xsl:choose>

Text unverändert ausgeben

[Bearbeiten | Quelltext bearbeiten]

Um durch XSLT beliebigen Text ausgeben zu lassen, kann das Tag <xsl:text> verwendet werden, wobei das Escaping (die Ausgabe von „<“ und „&“ als „&lt;“ und „&amp;“) abgeschaltet werden kann. Der Inhalt kann als normaler Text oder in einem CDATA-Abschnitt stehen. Der Vorteil des CDATA-Abschnitts besteht darin, dass sein Inhalt nicht interpretiert wird, er kann also auch XML-Syntax enthalten.

Zum Beispiel erzeugt

<xsl:text disable-output-escaping="yes">
  <![CDATA[ ### Hier darf < & >>< beliebiger Text stehen ### ]]>
</xsl:text>

die Ausgabe:

### Hier darf < & >>< beliebiger Text stehen ###

Anwendungen

[Bearbeiten | Quelltext bearbeiten]
XML-Sprachen und deren Umfang

Zwei wichtige Anwendungsgebiete für XSLT sind:

Beispiele für POP sind etwa:

Alternativen zu XSLT

[Bearbeiten | Quelltext bearbeiten]

DSSSL

[Bearbeiten | Quelltext bearbeiten]

Eine mögliche Alternative zu XSLT ist DSSSL, das man auch als Vorläufer von XSLT betrachten kann. Der wohl größte Vorteil von XSLT gegenüber DSSSL ist seine XML-basierte Syntax. Somit kann jeder XML-Editor automatisch auch für XSLT eingesetzt werden, außerdem gelten die Syntax-Regeln von XML (Wohlgeformtheit, Gültigkeit) damit auch für XSLT. Dadurch ist es möglich, dass XSLT sich selbst bearbeitet, man kann also Transformationen zur Erzeugung und Bearbeitung von Transformationen entwickeln.

MetaMorphosis

[Bearbeiten | Quelltext bearbeiten]

MetaMorphosis ist ebenfalls von DSSSL inspiriert. Im Gegensatz zu XSLT ist es ein „target driven“ (zielgesteuerter) Prozessor. Dabei wird der zu erstellende Zielbaum konstruiert. Die Regeln beschreiben nicht, wie die Eingabedatei verarbeitet werden soll, sondern, wie die Ausgabedatei konstruiert werden soll. Der Prozess beginnt mit einer virtuellen Regel „!begin“ mit der der Transformationsprozess beginnt. Die Transformationsregeln beschreiben, wie die Knoten gefüllt werden sollen. Dabei werden Abfragen in die Quellbäume wie auch in die bis dahin aufgebauten Zielbäume formuliert. Die Abfragesprache ist ein mengenorientierter Ausdruck, der alle Eigenschaften der Knoten auslesen und auch setzen kann. Erzeugte Knoten können nachträglich beliebig manipuliert werden.

Weitere Merkmale von MetaMorphosis unterstützen den industriellen Einsatz: flexible Speicherverwaltung für sehr große Dokumente, Aufbau von Hilfsdatenstrukturen (getindex, putindex) zum schnellen Zugriff, Plugin-Architektur, API für C++, C#, Java, die Möglichkeit dedizierte Frontends und Backend zu implementieren (in C++ wie auch in der MetaMorphosis-Skriptsprache).

Template Attribute Language

[Bearbeiten | Quelltext bearbeiten]

Im Rahmen des Anwendungsservers Zope wurde die Template Attribute Language (TAL) entwickelt; TAL-Templates sind (je nach Ausgabeformat) [X]HTML- oder XML-Dokumente, deren Inhalte durch Attribute dynamisch ersetzt werden können, und die damit Prototyp und verwendetes Template vereinen. Dem Element <xsl:for-each> entspricht etwa das Attribut tal:repeat; als Ausdruckssyntax wird die TAL Expression Syntax verwendet. Wenn sich kein HTML- oder XML-Element als Träger des Attributs anbietet, können auch <tal:beliebigerBezeichner>-Elemente verwendet werden.

Programmiersprachen

[Bearbeiten | Quelltext bearbeiten]

Eine grundsätzliche Alternative zu XSLT besteht in der Möglichkeit, solche Transformationen in jeder beliebigen Programmiersprache (z. B. Java, C++ oder Perl) abzufassen. XSLT kann dabei jedoch bei Einhaltung bestimmter Voraussetzungen eine gewisse Garantie für wohlgeformte und unter Umständen sogar gültige Zieldokumente gewähren.

Es ist auch möglich, beides zu koppeln: Die eigentliche Transformation geschieht dann per XSLT, jedoch werden innerhalb des XSLT-Stylesheets selbstdefinierte Funktionen zur Stringmanipulation aufgerufen. Das (z. B. in Ruby oder Python geschriebene) Programm besteht dann aus diesen selbstdefinierten Funktionen und dem Aufruf einer XSLT-Funktion, die den Stylesheet und die eigenen Funktionen als Parameter erhält.

Abgrenzung zu CSS

[Bearbeiten | Quelltext bearbeiten]

CSS ist keine Alternative zu XSLT, da es sich bei CSS um eine Formatierungssprache handelt. CSS beschreibt lediglich, wie die Bestandteile eines Baumes (akustisch oder visuell) zu formatieren sind, während XSLT den Baum radikal ändern kann oder als Ergebnis Dokumente liefern kann, die nicht auf XML basieren. So kann man mit XSLT z. B. automatisch Inhaltsverzeichnisse, Indizes, Link-Listen und komplexe Berechnungen erstellen, nicht jedoch mit CSS. Mit XSLT ist es zudem möglich, Ergebnisse zu erzeugen, die CSS als Formatierungssprache verwenden.

Code-Beispiel

[Bearbeiten | Quelltext bearbeiten]

Folgendes XSLT erzeugt ein einfaches Inhaltsverzeichnis für eine XHTML-Seite mit Überschriften:

<xsl:stylesheet
    version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:html="http://www.w3.org/1999/xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="html"
>

    <xsl:output
        method="xml"
        doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
        doctype-public="-//W3C//DTD XHTML 1.1//EN"
    />

    <xsl:template match="html:body">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <h1><xsl:apply-templates select="//html:title//text()" /></h1>
            <h2 id="t-o-c">Inhaltsverzeichnis</h2>
            <ul>
                <li><a href="#t-o-c">Inhaltsverzeichnis</a></li>
                <xsl:for-each select=".//html:h2">
                    <li>
                        <xsl:if test="not(@id)">
                            <xsl:message>Achtung: Kann ohne Id keinen Link erzeugen</xsl:message>
                        </xsl:if>
                        <a href="#{@id}"><xsl:apply-templates/></a>
                    </li>
                </xsl:for-each>
            </ul>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Siehe auch: XML, XSL-FO, XPath

XSLT-Prozessoren

[Bearbeiten | Quelltext bearbeiten]

Die meisten gängigen Webbrowser (u. a. Mozilla Firefox, Internet Explorer, Google Chrome, Opera) unterstützen mittlerweile XSLT. Folgend eine Auflistung von weiteren bekannten XSLT-fähigen Prozessoren und Bibliotheken.

Literatur

[Bearbeiten | Quelltext bearbeiten]
[Bearbeiten | Quelltext bearbeiten]
Wikibooks: XSLT – Lern- und Lehrmaterialien

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. w3.org
  2. Universal Turing Machine in XSLT. Unidex, Inc. (englisch).
  3. XSL Transformations (XSLT) Version 1.0, W3C Proposed Recommendation, in: archive.org. 8. Oktober 1999, archiviert vom Original am 16. Juni 2006; abgerufen am 12. Februar 2017 (englisch).
  4. XSLT 3.0
  5. Saxon 9.8 product comparison (Feature Matrix)
  6. Amelie Flatt, Arne Langner, Olof Leps: Phase III: Generating Artifacts from the Model. In: Model-Driven Development of Akoma Ntoso Application Profiles. Springer International Publishing, Cham 2022, ISBN 978-3-03114131-7, S. 31–37, doi:10.1007/978-3-031-14132-4_5 (springer.com [abgerufen am 7. Januar 2023]).