XSL Transformation
aus Wikipedia, der freien Enzyklopädie
XSLT steht für XSL Transformations und ist Teil der Extensible Stylesheet Language (XSL).
XSLT ist eine Programmiersprache zur Transformation von XML-Dokumenten. Es baut auf der logischen Baumstruktur eines XML-Dokumentes auf und erlaubt die Definition von Umwandlungsregeln. XSLT-Programme, sogenannte XSLT-Stylesheets, sind dabei ebenfalls nach den Regeln des XML-Standards aufgebaut (Namespace für XSLT).
Spezielle XSLT-Prozessoren lesen XSLT-Stylesheets ein und transformieren ein oder mehrere XML-Dokumente nach den Stylesheet-Regeln in das gewünschte Ausgabeformat. Solche XSLT-Prozessoren sind auch in vielen modernen Webbrowsern integriert (Opera (erst ab Version 9), Firefox, Internet Explorer Version 5 (erst seit Version 6 mit vollständiger XSLT-1.0-Unterstützung), Mozilla).
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. Derzeit hat XSLT 2.0 den Status einer "Candidate Recommendation" beim W3C.
XSLT ist nicht mit XSL-FO zu verwechseln; XSLT, XSL-FO und XPath bilden die Grundpfeiler für XSL.
Inhaltsverzeichnis |
[Bearbeiten] Geschichte
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 Bestandteilen besteht:
- Einer Sprache für die Beschreibung eines Dokuments als Baum mit Formatierungsanweisungen und Stilangaben: XSL Formatting Objects (XSL-FO)
- Einer Sprache für die Transformation eines beliebigen XML-Dokuments in einen anderen Baum, z. B. einen in XSL-FO: XSLT
- Einer Sprache für die Adressierung von Baumbestandteilen: XPath
[Bearbeiten] Funktionsweise
Die Sprache XSLT beschreibt die Umwandlung eines XML-Derivats (auch XML-Dialekt oder XML-Anwendung genannt) in ein anderes Dokument. Diesen Vorgang nennt man Transformation. Das resultierende Dokument entspricht meist der XML-Syntax, es können aber auch Textdateien oder 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") genannt werden. 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:
- XML als Basis für XSLT
- XSLT selbst (XML-basiert)
- XPath / XSLT Patterns
- Die Sprache(n) des Quell-Dokuments (XML-basiert, z. B. DocBook)
- Die Sprache(n) des Ziel-Dokuments (häufig XML-basiert, z. B. XHTML (ab XSLT 2.0), XML, XSLT selbst, aber auch HTML oder RELAX NG, Text-Format auch möglich)
- XML Namespaces zur Unterscheidung der einzelnen verwendeten Sprachen
Sowie ab XSLT 2.0:
- "XML Schema"-Datentypen
- XHTML
[Bearbeiten] Template Rules und Conflict Resolution
Template Rules (deutsch „Schablonen-Regeln“) werden immer dann angewendet, wenn eine bestimmte Bedingung passt. Das folgende Beispiel macht alle Titel kursiv, 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 das aktuelle Element 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.
- Importierte Regeln haben niedrigere Priorität.
- Wenn ein Attribut priority gegeben ist, wird es berücksichtigt.
- Spezifischere Patterns haben höhere Priorität als weniger spezifische. So ist beispielsweise der Test, ob irgendein Knoten existiert, weniger spezifisch als ein Test für einen Knoten mit konkretem Namen.
- Wenn es mehrere gleichberechtigte Regeln gibt, ist das ein Fehler, und wird vom XSLT-Parser als Meldung ausgegeben.
[Bearbeiten] Sortierung und bedingte Ausgabe
Um Elemente zu sortieren, kann ein „for-each
“-Tag mit einem „sort
“-Tag 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"/> </xsl:for-each>
XSLT bietet sowohl binäre Entscheidungen mittels des „if
“-Tags als auch mehrfache Entscheidungen über das „choose
“-Tag. 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 „choose
“- und „when
“-Tags verwendet werden.
<xsl:choose> <xsl:when test=...> <xsl:when test=...> <xsl:when test=...> </xsl:choose>
[Bearbeiten] Anwendungsgebiet
Für XSLT gibt es zwei Hauptanwendungsgebiete.
- POP (Presentation Oriented Publishing) bezeichnet die Transformation zum Zwecke der Darstellung. Mit unterschiedlichen Stylesheets können die Daten in XHTML, Formatting Objects (XSL-FO), SVG, SMIL, DocBook und viele andere Formate umgewandelt werden. Das Zieldokument muss hierbei nicht zwingend ein XML-Dokument sein. Das ursprüngliche semantische Markup wird dabei durch ein Stil-bezogenes Markup ersetzt.
- MOM (Message Oriented Middleware) bezeichnet die Transformation zum Zwecke des Datenaustausches. Da XML lediglich ein Sprachkonzept zur Entwicklung von Sprachen bildet, genügt es nicht, dass zwei Systeme (z. B. Programme) XML beherrschen, um gegenseitig Daten austauschen zu können. Sie müssen die gleiche XML-basierte Sprache verwenden. In dem häufigen Fall, in dem die Systeme nicht die gleiche XML-basierte Sprache verwenden, wird gerne XSLT eingesetzt, um mit Hilfe von Transformationen Übersetzer von der einen Sprache in die andere zu entwickeln.
[Bearbeiten] Anwendungsbeispiele
- Statistische Daten liegen als XML vor (z. B. aus der Datenbank) und werden mit Hilfe unterschiedlicher Transformationen unter anderem aufbereitet als Vektorgrafik in SVG, als bloßer Text, als Tabelle in XHTML, als PDF (über den Zwischenschritt XSL-FO) oder auch Excel (durch SpreadsheetML ab Office XP).
- Für eine Website werden die XHTML-Dateien oder XML-Dateien erstmals ohne Layout geschrieben und erhalten anschließend das Layout mit Hilfe einer Transformation. Der Vorteil ist dabei ähnlich dem eines klassischen CMS: Um das Layout zu ändern, ist es nicht notwendig, alle XHTML-Seiten zu ändern; stattdessen ändert man das Stylesheet und transformiert neu. Das XML Publishing System Apache Cocoon beispielsweise verwendet XSLT-Stylesheets hierfür sehr intensiv.
Derzeit wird XSLT wohl am häufigsten dazu verwendet, einfach XML-Dokumente durch Transformation in XHTML Dokumente inkl. CSS-Auszeichnungen umzuwandeln, die in Webbrowsern darstellbar sind.
[Bearbeiten] Alternativen zu XSLT
[Bearbeiten] DSSSL
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.
[Bearbeiten] MetaMorphosis
MetaMorphosis ist ebenfalls von DSSSL inspiriert. Im Gegensatz um XSLT ist es ein "target driven" 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 (es können im Gegensatz zu XSLT mehrere sein) 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).
MetaMorphosis kann von der Ovidius Homepage heruntergeladen werden (MetaMorphosis-free sowie MetaMorphosis-professional).
[Bearbeiten] Generische Programmiersprachen
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 ein gewisses Garant für wohl-geformte und unter Umständen sogar gültige Zieldokumente gewähren, außerdem ist die Entwicklung einer Transformation in XSLT in der Regel mit erheblich weniger Aufwand verbunden als die Entwicklung einer Transformation in einer generischen Programmiersprache.
Es ist auch möglich, beides zu koppeln: Die eigentliche Transformation geschieht dann per XSLT, jedoch innerhalb des XSLT-Stylesheets werden 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.
[Bearbeiten] CSS
Häufig wird CSS als Alternative zu XSLT genannt. CSS ist jedoch nur scheinbar eine Alternative zu XSLT, da es sich bei CSS lediglich 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.
[Bearbeiten] Beispiele
[Bearbeiten] Ein Inhaltsverzeichnis erzeugen
Folgendes XSLT erzeugt ein einfaches Inhaltsverzeichnis für eine XHTML-Seite mit Überschriften:
<?xml version="1.0" encoding="iso-8859-1"?> <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="toc">Inhaltsverzeichnis</h2> <ul> <li><a href="#toc">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="@*"/> <xsl:apply-templates/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Siehe auch: XML, XSL-FO, XPath
[Bearbeiten] XSLT-Prozessoren
- Saxon (Java, nichtvalidierende Variante frei)
- .NET Framework 1.0/1.1 (System.Xml.Xsl.XsltTransform) und 2.0 (System.Xml.Xsl.XsltCompiledTransform)
- TransforMiiX (C++, frei)
- Xalan-Java (Java, frei)
- Xalan-C++ (C++, frei)
- libxslt/xsltproc (C, frei)
- XT (Java, ursprünglich von James Clark, Open Source)
- Sablotron (C++, multiplattform, frei)
- msxsl.exe von Microsoft (Windows, nicht frei)
- PHP 5 XSL Funktionen (PHP 5, frei)
- xmlstarlet Werkzeuge ähnlich wie grep, sed, awk ... um XML Dateien zu bearbeiten und XSL Transformationen anzuwenden.
[Bearbeiten] Literatur
- Doug Tidwell: XSLT O'Reilly, ISBN 3-89721-292-7 (englisch)
- Michael Fitzgerald: Learning XSLT. O'Reilly, ISBN 0-596-00327-7 (englisch)
- Michael Kay: XSLT 2.0. Wrox Press, 2004, ISBN 0764569090 (englisch)
- Steven Holzner: Inside XSLT. New Riders, 2001, ISBN 0735711364 (englisch)
- E. R. Harold, W. S. Means: XML in a Nutshell. O'Reilly, ISBN 3-89721-339-7 (deutsch)
- Frank Bongers: XSLT 2.0 Handbuch Galileo Computing, 2005, ISBN 3-89842-361-1 (deutsch)
- Sal Mangano: XSLT Kochbuch O'Reilly 2006, ISBN 3-89721-457-1 (deutsch)
[Bearbeiten] Weblinks
- XSL Transformations (XSLT) Version 1.0 (Normative Version) (englisch)
- XSL Transformations (XSLT) Version 1.0 (nicht offizielle Übersetzung)
- XSL Transformations (XSLT) Version 2.0 (in Arbeit) (englisch)
- Das XML-XSLT-Seminar, Kapitel XSLT – Einführung in XSLT
- Tutorial zum Thema XSLT
- Ausführliches Beispiel (Wörterbuch)