Homepage-Webhilfe Event-Banner

Grundlagen

XSLT (XSL Transformation) ist eine Programmiersprache, die dazu verwendet wird, eine XML-Datei in ein anderes Dokument zu transformieren. XSLT ist dabei selbst eine Sprache, die auf XML basiert und ein Teil von XSL (eXtensible Stylesheet Language), den Stylesheet-Sprachen der XML-Familie.

Da XSLT XML basierend ist, ist Ihnen der allgemeine Syntax bereits von XML bekannt. In diesem Thema lernen Sie daher nur die Elemente und Attribute von XSLT kennen, für was diese verwendet werden und wie diese funktionieren. Für die Adressierung von Knoten wird die Sprache XPath eingesetzt. Die Abfragesprache XPath haben Sie bereits im vorherigen Kapitel kennengelernt.

Für den Transformationsvorgang werden Programme, die sogenannten XSLT-Prozessoren, benötigt. XSLT-Prozessoren können aus dem Internet bezogen werden. Zudem sind die meisten Browser in der Lage, eine XSL-Transformation durchzuführen.


XSL-Transformations-Grafik Eine XSLT-Datei enthält ein Skript, welches angibt, wie ein bestimmter Baum in einen anderen Baum transformiert (also „übersetzt“) werden soll. Typischerweise wird dabei ein XML-Dokument in ein HTML-Dokument (meistens also zur direkten Darstellung im Browser) übersetzt. Es ist jedoch auch möglich, ein XML-Dokument in ein anderes XML-Dokument (z. B. zur Umsetzung in eine andere Baumstruktur oder zum Filtern von Inhalten) oder ein XML-Dokument in ein anderes XML basierendes Dokument zu transformieren.

Ein XSLT-Skript kann für mehrere XML-Dokumente eingesetzt werden (so wie auch eine CSS-Datei in mehreren HTML-Dokumenten eingesetzt werden kann). Um eine Verknüpfung herzustellen, muss im XML-Dokument ein Link zum Stylesheet-Dokument angegeben werden. Die Notation erfolgt dabei als Verarbeitungshinweis mit dem Zusatz -stylesheet. Als Attribute werden dort href (Pfad zur Datei) und type (MIME-Typ des Stylesheets, für XSLT text/xsl oder auch application/xslt+xml) angegeben.

<?xml-stylesheet href="stylesheet.xsl" type="text/xsl" ?>

XSLT-Skripte werden in Dateien mit der Erweiterung .xsl oder .xslt gespeichert. Den Aufbau solcher Skripte beschreiben wir im Abschnitt Grundaufbau genauer.

Um mit Hilfe einer XML- und XSLT-Datei eine weitere Datei zu erzeugen, wird ein Programm (das sogenannte Transformationsprogramm bzw. meistens als XSLT-Prozessor bezeichnet) benötigt. Dieses Programm übersetzt die XML-Datei in eine andere Datei, wobei die XSLT-Datei als Vorlage für den Transformationsvorgang verwendet wird. Zu den bekanntesten XSLT-Prozessoren gehören unter anderem Saxon und Xalan. Des Weiteren enthalten die meisten gängigen Browser einen XSLT-Prozessor. Dieser ist jedoch im Regelfall auf die Transformation in HTML begrenzt.

Der XSLT-Prozessor Xalan wird von der Apache Software Foundation entwickelt und ist in zwei unterschiedlichen Varianten verfügbar: Xalan-C (für C++) und Xalan-J (für Java). Von beiden Varianten sind sowohl Quellcode als auch vorkompilierte Versionen verfügbar. Für die Beispiele in diesem Kapitel gibt es immer zwei Ansichten: eine XML- und eine HTML-Ansicht. Die XML-Ansicht zeigt, sofern Ihr Browser einen XSLT-Prozessor enthält, die vom Browser transformierte Ausgabe, andernfalls wird Ihnen der XML-Baum (Quellcode) angezeigt. Die HTML-Ansicht zeigt eine HTML-Datei. Diese Datei wurde mit dem XSLT-Prozessor Xalan-J erstellt. Xalan-J wird über die Kommandozeile aufgerufen. Dabei übergeben Sie i. d. R. folgende Parameter: -IN (eingehende XML-Datei), -XSL (XSL-Datei) und -OUT (ausgehende HTML-/XML-Datei). Der folgende Code zeigt, mit welchem Kommando die HTML-Datei des ersten Beispiels (Werte ausgeben) mittels Xalan-J erstellt wurde:

java -jar xalan.jar -IN werte-ausgeben.xml -XSL werte-ausgeben.xsl -OUT werte-ausgeben.html

Jede XSLT-Datei beginnt in der Regel mit einer XML-Deklaration. Diese ist jedoch, wie bei anderen XML-Dokumenten auch, optional. Das Wurzelelement bei XSLT ist stylesheet. Innerhalb dieses Elements wird nun das version-Attribut mit dem Wert 1.0 angegeben. Zwar gibt es schon eine Version 2.0, jedoch wird diese kaum verwendet. Dies liegt dabei vor allem an der mangelnden Unterstützung. Als weiteres Attribut im stylesheet-Element wird xmlns notiert, um einen Namensraum zu spezifizieren. Hier hat es sich eingebürgert, als Präfix xls zu verwenden. Als URI für den Namensraum von XSLT wird http://www.w3.org/1999/XSL/Transform verwendet. Die Elemente die für das resultierende Dokument verwendet werden, werden i. d. R. ohne Namensraum angegeben. Innerhalb des Wurzelelements werden ein oder mehrere Templates notiert. Diese stellen den Hauptbestandteil des Dokuments dar. Die Notation und Funktionsweise von Templates erklären wir jedoch später.

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

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

Nun wollen wir uns aber auch mal dem ersten Beispiel widmen: Wie bereits oben erwähnt, besteht eine XSLT-Datei im Wesentlichen aus Templates, also Schablonen bzw. Vorlagen. Wie diese genau funktionieren bzw. wie man diese verwendet, möchten wir im nächsten Punkt genauer erklären. Als erstes wollen wir Ihnen jedoch zeigen, wie Sie einen Wert aus einer XML-Datei ausgeben. Um einen Wert im Ausgabebaum zu platzieren, benötigen wir das Element value-of. Ein wichtiges Attribut des value-of-Elements ist select. Mit dem select-Attribut wird der auszugebende Wert mit Hilfe eines XPath-Ausdrucks selektiert.

Im folgenden Beispiel werden die Elemente titel und text aus dem XML-Dokument als Inhalte der HTML-Elemente h1 (Überschrift der 1. Ebene) und p (Absatz) platziert und somit für den Benutzer dargestellt. Das in diesem Beispiel verwendete XSLT-Element template wird als Vorlage benötigt und ist erforderlich. Dessen Bedeutung erklären wir jedoch erst im nächsten Abschnitt.

XML-Code:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet href="werte-ausgeben.xsl" type="text/xsl" ?>

<artikel>
    <titel>Grundlagen von XSLT</titel>
    <text>Hier lernen Sie die Grundlagen von XSLT ...</text>
</artikel>

XSLT-Code:

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <title>Werte ausgeben - XSLT Code-Beispiel</title>
                
                <meta charset="utf-8" />
                
                <meta name="robots" content="noindex,nofollow" />
                <meta name="publisher" content="Homepage-Webhilfe" />
            </head>
            
            <body>
                <article>
                    <h1><xsl:value-of select="/artikel/titel" /></h1>
                    <p><xsl:value-of select="/artikel/text" /></p>
                </article>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
VorschauXML:
VorschauHTML:

Übrigens: Es ist natürlich auch möglich, innerhalb des select-Attributs eine XPath-Funktion aufzurufen, um somit z. B. nur einen Teil einer Zeichenkette auszugeben.


In XSLT gibt es ein sogenanntes Template-System, d. h. es gibt Transformationsregeln, welche zu einem Regelsatz (dem Template oder auch als Schablone oder Vorlage bezeichnet) zusammengefasst werden. Von solchen Regelsätzen gibt es innerhalb eines XSLT-Dokuments im Normalfall mehrere. In dem Beispiel von oben (Werte ausgeben) gab es nur ein Template. Regelsätze können auf zwei verschiedene Arten genutzt werden: Anwendung und Aufruf. Bei einer Template-Anwendung wird ein Template immer dann angewendet, wenn ein bestimmter XPath-Ausdruck zutrifft. Bei Template-Aufrufen muss das gewünschte Template explizit aufgerufen werden.

Eine Schablone zeichnet sich durch das Element template aus. Im Element muss nun das Attribut match (für Template-Anwendungen) oder name (für Template-Aufrufe) angegeben werden. Als erstes wollen wir uns der Template-Anwendung widmen, d. h. wir benötigen das Attribut match. Im Attribut match wird ein Knotentest (im XPath-Syntax) angegeben, um somit das Template auf bestimmte Knoten oder einen bestimmten Pfad zu begrenzen. In der Regel besitzt jedes XSLT-Stylesheet über ein Template, welches sich auf Wurzelknoten bezieht (match="/"). Bei HTML-Dokumenten wird dort dann meist der Grundaufbau einer HTML-Seite notiert. Um nun innerhalb eines Templates weitere Templates anzuwenden, benötigen wir das leere Element apply-templates. Optional kann das Attribut select angegeben werden, um nur Templates, welche auf einen bestimmten Knotentest bzw. Pfad zutreffen, anzuwenden. Mit Hilfe dieser Template-Technik können Sie sich Schritt für Schritt durch das Dokument durcharbeiten, um somit die Transformation durchzuführen.

Im folgenden Beispiel verwenden wir die gleiche XML-Struktur wie beim vorherigen Beispiel, jedoch verfügt unser Stylesheet nun über 3 weitere Templates. Innerhalb des „Wurzel-Templates“ (match="/") haben wir den HTML-Grundaufbau notiert. Im body-Element wird nun über apply-templates ein weiteres Template angewendet. In diesem Fall handelt es sich um das Template, welches das Wurzelelement selektiert (match="artikel"). Innerhalb dieses Templates wird das HTML-Element article notiert. Des Weiteren wird hier erneut das apply-templates-Element verwendet, wodurch die beiden anderen Templates (match="titel" und match="text") angewendet werden (in der Reihenfolge, wie diese im XML-Dokument angegeben sind).

XML-Code:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet href="templates-anwenden.xsl" type="text/xsl" ?>

<artikel>
    <titel>Grundlagen von XSLT</titel>
    <text>Hier lernen Sie die Grundlagen von XSLT ...</text>
</artikel>

XSLT-Code:

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <title>Templates anwenden - XSLT Code-Beispiel</title>
                
                <meta charset="utf-8" />
                
                <meta name="robots" content="noindex,nofollow" />
                <meta name="publisher" content="Homepage-Webhilfe" />
            </head>
            
            <body>
                <xsl:apply-templates />
            </body>
        </html>
    </xsl:template>
    
    <xsl:template match="artikel">
        <article>
            <xsl:apply-templates />
        </article>
    </xsl:template>
    
    <xsl:template match="titel">
        <h1><xsl:value-of select="." /></h1>
    </xsl:template>
    
    <xsl:template match="text">
        <p><xsl:value-of select="." /></p>
    </xsl:template>
</xsl:stylesheet>
VorschauXML:
VorschauHTML:

Wie bereits oben erwähnt, ist es auch möglich, ein Template zu definieren, um dies später einfach nur aufzurufen. Diese Möglichkeit wird jedoch normalerweise nicht für die „normale“ Abarbeitung eines XML-Dokuments verwendet, sondern lediglich, um bestimmte „Standard-Schablonen“ zu definieren, die innerhalb des Ergebnisbaums, unabhängig von der XML-Struktur und u. U. auch mehrmals, benötigt werden. Im Beispiel unten wird diese „Regel“ gebrochen, jedoch bleibt dadurch das Beispiel leicht nachvollziehbar. Ein Template, welches für den Aufruf gedacht ist, muss über das Attribut name verfügen. Hier können Sie einen beliebigen, jedoch eindeutigen Namen angeben. Mit dem Element call-template können Sie nun ein solches Template aufrufen. Hierfür muss im name-Attribut der Name des Templates angegeben werden.

XML-Code:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml-stylesheet href="templates-aufrufen.xsl" type="text/xsl" ?>

<artikel>
    <titel>Grundlagen von XSLT</titel>
    <text>Hier lernen Sie die Grundlagen von XSLT ...</text>
</artikel>

XSLT-Code:

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <title>Templates aufrufen - XSLT Code-Beispiel</title>
                
                <meta charset="utf-8" />
                
                <meta name="robots" content="noindex,nofollow" />
                <meta name="publisher" content="Homepage-Webhilfe" />
            </head>
            
            <body>
                <xsl:call-template name="Artikel" />
            </body>
        </html>
    </xsl:template>
    
    <xsl:template name="Artikel">
        <article>
            <h1><xsl:value-of select="/artikel/titel" /></h1>
            <p><xsl:value-of select="/artikel/text" /></p>
        </article>
    </xsl:template>
</xsl:stylesheet>
VorschauXML:
VorschauHTML:

Übrigens: Alle 3 Beispiele (Werte ausgeben, Templates anwenden und Templates aufrufen) erzeugen die gleiche Ausgabe.


In XSLT haben Sie die Möglichkeit, in einer Variablen einen Wert (z. B. einen Text) zu speichern. Verwendet werden Variablen im Allgemeinen immer dann, wenn ein Wert mehrmals benötigt wird (um somit den mehrmaligen Zugriff auf XML-Datei zu vermeiden). Eine Variable wird über das XSLT-Element variable definiert. Das Attribut name legt dabei einen eindeutigen Namen für die Variable fest. Wird die Variable innerhalb eines template-Elements notiert, so handelt es sich um eine lokale Variable und ist auch nur innerhalb der Schablone verfügbar. Variablen die außerhalb von template-Elementen notiert sind, gelten als globale Variablen und sind im kompletten Stylesheet verfügbar. Als Wert des Attributs select können Sie einen XPath-Ausdruck angeben, um somit der Variable einen Wert aus der XML-Datei zuzuweisen. Wird das Attribut select weggelassen, so müssen Sie das Element zweiteilig (und nicht wie sonst einteilig) angeben und zwischen den Tags den Wert der Variable notieren. Es kann sich dabei um eine Konstante (also einen „festen“ Wert) oder einen variablen Wert resultierend aus einer Bedingung (dazu später mehr) handeln. Um innerhalb eines select-Attributs (also dem Attribut, welches Sie kennengelernt haben, um Knoten zu selektieren) oder anderen dafür vorgesehenen Attributen auf die Variable zuzugreifen, notieren Sie das Dollar-Zeichen ($) gefolgt von dem definierten Variablennamen.

XML-Code:

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

<text>
    Hier steht ein Text, welcher jedoch nur als Platzhalter fungiert.
</text>

XSLT-Code:

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <head>
                <title>Variablen - XSLT Code-Beispiel</title>
                
                <meta charset="utf-8" />
                
                <meta name="robots" content="noindex,nofollow" />
                <meta name="publisher" content="Homepage-Webhilfe" />
            </head>
            
            <body>
                <xsl:variable name="inhalt" select="/text" />
                <p><xsl:value-of select="$inhalt" /></p>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
VorschauXML:
VorschauHTML:
Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen OK