Extensible Stylesheet Language Transformation

Aus Mikiwiki
Zur Navigation springen Zur Suche springen

Die Extensible Stylesheet Language Transformation / XSLT ist eine Programmiersprache zur Umwandlung von XML-Dokumenten. Sie ist Teil von XSL und stellt eine turing-vollständige Sprache dar. XSLT, XSL-FO und Xpath bilden die Grundpfeiler für XSL.

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, so Opera (ab Version 9), Firefox, Internet Explorer Version 5 (erst seit Version 6 mit vollständiger XSLT-1.0-Unterstützung) oder Mozilla.

Einführung

XSLT ist eine sogenannte funktionale Programmiersprache. Das Prinzip unterscheidet sich grundlegend von den imperativen Sprachen wie etwa PHP. Der Programmfluss selbst wird in erster Linie durch Automatismen initiiert, in zweiter Linie durch Regeln. Regeln werden definiert, um bestimmte Effekte beim Auftreten von bestimmten Daten zu erreichen. Der Vorteil solcher Systeme ist die weitgehende - bei XSLT per Definition die vollkommene - Befreiung von Seiteneffekten. Wenn eine Regel gilt, so wird ausschliesslich diese Regel ausgeführt und zwar immer in derselben Art und Weise. Dazu gehört auch, dass Variablen zwar verfügbar sind, etwa um einer Regel einen Wert zu übergeben, ihren Inhalt aber nachträglich nicht ändern können. Sie verhalten sich also eher wie Konstanten in imperativen Sprachen. Nachträgliche Änderungen könnten Seiteneffekte erzeugen, was nicht erlaubt ist.

Dennoch kann damit erstaunlich effektiv programmiert werden. Nicht immer ist XSLT die perfekte Sprache. Richtig leistungsfähig wird sie erst in Verbindung mit einer modernen objektorientierten Sprache, die hinreichende imperative Merkmale aufweist. Es ist naheliegend, Umwandlung und Programm mit PHP in einen Kontext zu überführen.

Die Grundregeln von XSLT

XSLT basiert auf XML, weshalb jede Datei durch die entsprechende Deklaration eingeleitet wird. Dann folgt das Wurzelelement "stylesheet". Als Standardnamensraum wird "xsl" empfohlen, diese Angabe ist aber im Prinzip freiwillig. Es empfiehlt sich jedoch, grundsätzlich den Standardnamensraum zu verwenden. Daraus ergibt sich das folgende Grundgerüst für XSLT.

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

Namensraumalias

Durch die Erweiterung des Attributs "xmlns" wird der Namensraumalias festgelegt. Weitergehende Informationen zu Namensräumen finden sich in der XML-Literatur. Generell kapseln Namensräume die Elementnamen, sodass Namenskonflikte vermieden werden. Der Namensraum selbst wird durch einen eindeutigen URI bezeichnet - bei XSLT heisst diese "http://www.w3.org/1999/XSL/Transform". Diese Adressen ähneln einem URL im WWW und sind meist auch vorhanden - das ist aber keine keine Voraussetzung für den Einsatz. Im Dokument selbst wird dieser Namensraum durch einen frei wählbaren Alias ersetzt; in XSLT ist der Alias "xsl:" üblich.

Zwischen den Wurzelelementen wird nun das Regelwerk aufgebaut. Eine wichtige Rolle spielt das folgende Element.

<xsl:template></xsl:template>

Vorlagen

Vorlagen (engl. template) bilden die Stufen der eigentlichen Umwandlung. Dabei gibt es zwei Arten von Vorlagen. Zum einen können sie durch eine XPath-Anweisung in ihrer Zuständigkeit programmiert werden. Die folgende Regel zeigt, wie jedes Element "<name>" zu einer Ausgabe im Ausgabedatenstrom führt.

<xsl:template match="name">
  <h1>Name</h1>
</xsl:template>

Eine andere Methode ist der Aufruf benannter Vorlagen. Der Inhalt des Elements findet dabei allerdings noch keine Berücksichtigung. Text kann, wie gezeigt, direkt ausgegeben werden. Dabei ist zu beachten, dass es sich um wohlgeformtes XML handeln muss; HTML muss also gegebenenfalls gemäss den regeln von XHTML 1.0 verändert werden. Wird eine Vorlage mit "<xsl:template select="regelname">" beannt, so kann diese wie folgt aufgerufen werden.

<xsl:call-template name="regelname" />

Text

Soll ausdrücklich Text ausgegeben werden, der mit dem Editor nicht darstellbar ist, so muss das Element "<xsl:text>" eingesetzt werden; das ist gemäss der Spezifikation eigentlich immer notwendig. Die direkte Angabe von Text doer Tags ist eine Vereinfachung. Es ist zu beachten, dass die Angabe hexadezimaler Codes genau wie in PHP auch in XSLT mit dem Präfix "0x" erklärt wird.

<xsl:template match="name">
  Hier folgt ein Zeilenumbruch:<xsl:text>0x0A</xsl:text>
</xsl:template>

Kommentare

Kommentare entsprechen XML-konform den aus HTML bekannten und werden nicht in den Ausgabedatenstrom übernommen.

<!-- Ein Kommentar in XSLT sieht aus wie in HTML -->

Praktische Verarbeitung von Vorlagen

Vorlagen werden meist verschachtelt angewendet. das folgende Beispiel zeigt das Grundgerüst einer HTML-Siete, wie sie mit XSLT erzeugt wird. Zuerst erkennt der XSLT-Prozessor hier, dass die Vorlage das Wurzelelement der XML-Quelle verarbeitet. Dann wird das Grundgerüst der HTML-Seite erstellt.

<xsl:template match="/">
  <html>
  <body>
  <xsl:apply-templates />
  </body>
  </html>
</xsl:template>

Innerhalb des "<body>"-Tags wird versucht, alle übrigen Elemente durch Aufruf der passenden Vorlagen zu verarbeiten. Dass das Element "<xsl:apply-template>" keine Parameter hat, ist ein besonderer Fall. Er setzt voraus, dass alle Elemente irgendwo auf eine passende Vorlage stossen, wobei der XSLT-Prozessor den besten Treffer auswählt und ausschliesslich diesen ausführt. Allerdings besitzt der XSLT-Prozessor eine Fallback-Funktion. Trifft keine Vorlage zu, so wird der Inhalt des aktuellen Tags genommen und als gültiger Ausgabewert betrachtet. Voraussetzung für die Ausgabe ist aber, dass wenigstens an einer Stelle <"xsl:apply-templates>" steht.

Sollen Inhalte von Tags gezielt ausgegeben werden, so wird "<xsl:value-of>" verwendet. Das Attribut "select" wählt den Inhalt des durch XPath ermittelten Knotens und die gesamte Anweisung gibt diesen als Zeichenkette aus.

<xsl:template match="B">
  <xsl:value-of <b>select="."</b> />
</xsl:template>

Verwendung von Attributen

Beim Einsatz innerhalb einer Vorlage bezieht sich der von "select" akzeptierte Pfad auf den übergebenen Knoten, ist also relativ. Es können aber auch absolute Pfadangaben verwendet werden. Der alleinstehende Punkt stellt in XPath den aktuellen Knoten dar, im vorigen Beispiel also den Inhalt des Tags "<B>". Auf demselben Wege werden auch Attribute gelesen. Das folgende Beispiel sucht nach Elementen vom ZTyp "<a>" und gibt den Inhalt des Attributs "href" aus. Der direkte Zugriff mit einer absoluten XPath-Anweisung wäre "a/@href".

<xsl:template match="a">
  <xsl:value-of select="@href" />
</xsl:template>

Auf den Parameter eines Attributs kann auch direkt zugegriffen werden. Ein "<a href>"-Tag wird wie folgt in "<img src>" umgewandelt. Die Schreibweise mit den geschweiften Klammern ist immer dann angebracht, wenn der Einsatz eines Tags aufgrund der Syntax nicht möglich ist. Andererseits ist es mit "<sl:element>" und "<xsl:attribute>" möglich, beliebige Tags indirekt zu erzeugen.

<xsl:template match="a">
  <img src="{@href}" />
</xsl:template>

Programmieren mit XSLT

Neben den regeln gehören zum funktionalen Programmieren auch Anweisungen.

Verzweigung

Eine einfache Verzweigung mit "<xsl:if>".

<xsl:if test="@directory='hasfiles'">
  Dieses Verzeichnis enthält Dateien.
</xsl:if>

Der Test kann verschiedene Operatoren und Funktionen verwenden, um Knoten nach allerlei Kriterien zu untersuchen. Eine "else"-Anweisung gibt es übrigens nicht, für diesen Zweck ist die Mehrfachverzweigung "<xsl:choose>" gedacht.

<xsl:choose>
  <xsl:when test="attribute='archive'">Archiv</xsl:when>
  <xsl:when test="attribute='compressed'">Compressed</xsl:when>
  <xsl:when test="attribute='hidden'">Hidden</xsl:when>
  <xsl:otherwise>Unknown</xsl:otherwise>
</xsl:choose>

Schleife

Mit "<xsl:for-each>" können Listen von bestimmten Tags an einer Stelle ausgegeben werden. Schleifen im Sinne imperativer Programmierung gibt es aber nicht, da veränderliche Zustände in XSLT nicht erlaubt sind. Die Anweisung "<xsl:for-each>" gibt wie "<xsl:template>" jeweisl einen aktuellen Knoten für jedes gefundene Element aus. Deshalb funktioniert hier auch der verkürzte Zugriff auf den Inhalt mit dem Punkt-Alias.

<xsl:for-each select="name">
  <a href="{.}"><xsl:value-of select="." /></a><br />
</xsl:for-each>

Die Anweisungen "for" und "while" gibt es in XSLT nicht. Beide benötigen Variablen, deren Zustand sich ändert. Das ist in funktionalen Sprachen nicht möglich, weswegen diese Anweisungen nicht sinnvoll wären. Komplexere Schleifen werden durch Rekursion (Selbstaufruf einer Vorlage) und Parameter ermöglicht. Oft ist das sogar kompakter als ein vergleichbares imperatives Programm.

Sortieren

Mit der Anweisung "<xsl:sort>" kann innerhalb einer Schleife sortiert werden.

<xsl:for-each select="name">
  <xsl:sort select="." order="descending" />
  <a href="{.}"><xsl:value-of select="." /></a><br />
</xsl:for-each>

Das Element "<xsl:sort>" ist ausserdem auch in "<xsl:apply-templates>" anwendbar. Es versteht allerdings einige Attribute mehr, mit denen die Steuerung der Sortierung erfolgen kann.

Variablen

Variablen verhalten sich unter XSLT ähnlich wie Konstanten in anderen Programmiersprachen. Sie können Werte, Knoten oder Knotenbäume speichern.

<xsl:variable name="fielddata" select="attribute" />

Variablen können auch komplexere Inhalte aufnehmen. Im folgenden Beispiel ist auch die Verwendung von XPath-Funktionen zu sehen.

<xsl:variable name="alldata">
  <xsl:if test="position()=last()">
    TRUE
  </xsl:if>
  <xsl:if test="position()=1">
    FALSE
  </xsl:if>
</xsl:variable>

Variablen gelten nur innerhalb der Vorlage oder der Schleife, in der sie definiert wurden. Dieses Verhalten ist nicht veränderbar, es gibt also keine Modifikatoren wie "public" oder "private". Ähnlich wie Variablen werden auch Parameter verwendet. Mit ihrer Hilfe können in einer Vorlage verschiedene Werte übergeben werden, damit diese sich je nach Art des Aufrufs unterschiedlich verhält. In einer benannten Vorlage kann der Aufruf etwa wie folgt aussehen.

<xsl:call-template name="show.files">
  <xsl:with-param name="handler">no</xsl:with-param>
</xsl:call-template>

Innerhalb einer Vorlage werden die übergebenen Parameter dann wie folgt verwendet. Das Attribut "select" in "<xsl:param>" bestimmt einen Standardwert, wenn der Parameter nicht übergeben wurde.

<xsl:template name="show.files">
  <xsl:param name="handler" select="" />
  ...

Nummern

XSLT verfügt über einige komplexere Anweisungen, die für grössere Projekte von Bedeutung sind. Dazu gehört "<xsl:number>" zum Erzeugen fortlaufender Nummern oder Buchstabenfolgen.

Knoten kopieren

Wenn statt dem Textinhalt des Knotens der Umgang mit ganzen Knoten notwendig ist, findet "<xsl:copy-of>" Verwendung. Sollen mehrere Knoten und Attribute kopiert werden, so können mehrere Anweisungen mit "<xsl:copy>" zusammengefasst werden. Das folgende Beispiel kopiert ein XML-Dokument vollständig in ein anderes.

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*">
    <xsl:apply-templates />
  </xsl:copy>
<xsl:template>

Ausgabesteuerung

Hier stellt sich die Frage, warum ein Dokument ausgerechnet mit XSLT unverändert kopiert werden sollte. Mit der Anweisung "<xsl:output>", die immer am Anfang des Dokuments steht, kann die Kodierung des Ausgabestroms gesteuert werden. Ist ein XML-Dokument UTF-8-kodiert, so kann es mit der Kopiervorlage des vorigen Beispiels leicht in ein anderes Format gebracht werden - nebenbei auch ins HMTL 4.0-Format.

<xsl:output encoding="ISO-8859-1" method="html" />

Für grössere Projekte können XSLT-Dateien mit Hilfe der Anweisungen "<xsl:output>" und "<xsl:include>" importiert werden. Mit der letzteren kann ein Dokument so eingefügt werden, als wäre der Inhalt an dieser Stelle geschrieben worden. Der Import hat eine geringere Wichtigkeit; stehen Regeln miteinander in Konflikt, so unterliegen die importierten.

XSLT-Funktionen

Da Umwandlungen oft in Abhängigkeit von konkreten Daten ablaufen, stellt XSLT einige elementare Funktionen zur Verfügung, die vor allem in "select"- und "test"-Attributen Verwendung finden. Die folgende Tabelle zeigt die wichtigsten.

Funktion Beschreibung
boolean()
number()
string()
Typumwandlungen ausführen.
format_number() Zahlen formatieren.
ceiling()
floor()
round()
Zahlenberechnungen und Runden.
concat() Zeichenketten verbinden.
contains()
starts-with()
Zeichen in einer Zeichenkette ermitteln.
normalize_whitespace() Umgang mit Leerzeichen.
string-length() Anzahl Zeichen.
substring()
substring-before()
substring-after()
Teile einer Zeichenkette ermitteln.
translate() Zeichen austauschen.
count()
sum()
Zählen von Knoten und Summieren von Werten aus Listen.
generate-id()
local-name()
name()
Funktion zum Umgang mit Knoten.
false()
true()
not()
Boolesche Werte für Boolesche Ausdrücke beschaffen.
current()
last()
position()
Die Position des Zeigers auf Knotenlisten bestimmen.
document() Dateizugriff, Modul laden.
key()
id()
Einen Knoten mit bestimmten Eigenschaften finden.
element-available() Eine Parserfunktion suchen.

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
Wikipedia ger XSL Transformationwbm Enzyklopädischer Artikel