XSLT
Inhaltsverzeichnis |
Autoren
- Gino Napierala (s3ginapi@stud.hs-zigr.de)
- Martin Kubasch (s3makuba@stud.hs-zigr.de)
Einleitung
XSLT(Extensible Stylesheet Language Transformation) gehört zur Familie der XSL-Sprachen . Es wurde Entwickelt zur Transformation von XML-Quelldokumenten in andere Dokumenttypen wie beispielsweiße XML, HTML oder einfache Textdokumente.
Grundlegende Merkmale und Aufbau von XSLT- Dokumenten
XSLT ist eine in XML Definierte Sprache, diese beschreibt die Umwandlung von XML-Dokumenten in ein anderes Dokument. Diese Dokumente können XML-Dokumente sein, jedoch auch anderen Dokumente. Zur Umwandlung werden Stylesheet benötigt. Quelldokument und Ergebnisdokument können von einander abweichen. Bei XSLT kann komplett auf DTD’s und Schemas verzichtet werden, jedoch muss das Quelldokument wohlgeformt sein. Aufgrund der XSLT-Stylesheets können nicht auf HTML-Formate angewandt werden, auf XHTML-Dateien können sie angewandt werden. Eine Übersetzung in XHTML ist daher sinnvoll um XSLT zu nutzen. XSLT nutzt Baumstruktur als Modell von XML-Dokumenten. Ein XSLT-Stylesheet beschreibt demzufolge die Umwandlung einer Baumstruktur des Eingabe-Dokuments in die Baumstruktur eines Ausgabedokuments. Die Baumstruktur des Ausgabedokuments wird festgelegt. Teile des Eingabebaums können durch die Syntax-Ausdrücke von XPath http://programmingwiki.de/Einf%C3%BChrung_in_die_XML-Technologien_XPath,_XSLT_und_XQuery/XPath, welches XSLT verwendet, in Beziehung gebracht werden. Zu jedem Zeitpunkt der Verarbeitung der Stylesheets beziehen sich die Vorlagen auf den aktuellen Knoten der Knotenliste.
XSLT Prozessoren
Aufbau und Funktionsweise von XSLT Prozessoren
Zur Formatierung eines XML-Dokuments, mittels eines XSL-Stylesheets, wird ein XSLT-Prozessor benötigt. Bei diesem Vorgang werden die Template-Regeln (innerhalb des Stylesheets) auf das Eingabedokument angewendet um so ein neues Ausgabedokument zu erzeugen. Für die Transformation benötigt der XSLT Prozessor sowohl ein XML Dokument als auch ein Stylesheet Dokument welche als Dateien eingelesen werden, aber nicht direkt in dieser Form weiterbearbeitet werden. Erst durch die Umwandlung der Dokumente in Baumrepräsentationen mit hilfe einen XML Parsers ( DOM oder eigener Datenstruktur) ist der XSLT Prozessor in der Lage weiterzuarbeiten. Als Ausgabe wird ein Ergebnisbaum (resulttree) erzeugt . Durch die darauf folgende serialisierung kann das gewünschte Textdokument(XML, HTML, Plaintext, XSL-FO Designstruktur, etc.) erzeugt werden.
[[Bild:S3makuba_Xml2xml.jpg|400px]|300px]]
Anwendungsbereiche der XSLT Prozessoren
XSLT Prozessoren haben viele Anwedungsmöglichkeiten, dabei wirde es wohl am häufigsten in Webbrowsern genutzt. Ein Grund dafür ist die starke Verbreitung des Microsoft Internet Explorers welcher einen integrieten XSLT Prozessor besitzt. Aber auch in der Entwicklung eigener Programme werden sehr häufig vorhandene XSLT Prozessoren genutzt. Auf drei dieser Prozessoren ( SAXON , Xalan , MSXML ) soll hier genauer eingegangen werden.
Xalan
Bei dem XSLT-Prozessor von Xalan handelt es sich um einen Open Source-Prozessor der im Rahmen des Apache XML Projektes3 entstanden ist. Dieser implimentiert sowohl die XPath 1.0 als auch die XSLT 1.0 Spezifikation des W3C vollständig. Da jedoch die dritte Spezifikation ( XSL Formatting Objects) nicht enthalten ist , muss in diesen fällen auf andere Prozessoren zurückgegriffen werden. Xalan wird unterschieden zwischen den Versionen Java- (Xalan-J) und C++- (Xalan-C++)und nutzt für diese Versionen den XML Parser Xerces4.
Seit der Xalan Version 2.5 gibt es zwei Möglichkeiten der Verwendung des Prozessors. Zum einen kann er als normaler interpretierender XSLT Prozessor (Xalan Interpretive Processor) genutzt werden. Bei der zweiten Variante arbeitet der XSLT-Prozessor mit vorkompilierten Stylesheet (Xalan Compiled Processor) . Bei beiden Varianten wird mit einer internen Baumrepräsentation gearbeitet, dem DTM ( Document Table Model ). Das DTM untescheidet sich vom DOM in der Hinsicht , dass es ein read-only Model ist. Daraus kann man schließen das im Gegensatz des DOM Modells keine neuen Knoten erzeugt werden und keine Daten in das Modell geschrieben werden können.
Eine Besonderheit der neuen Versionen von Xalan besteht im Xalan Compiled Processor XSLTC. Dieser besitzt die Möglichkeit XSL Stylesheet Dokumente in Java Bytecode zu kompilieren (Translets). Dadurch kann man einmal verarbeitete Stylesheets mehrfach auf XML Dokumente anwenden. Besonders wirkungsvoll kann dieses System werden wenn man es bei vielen XML Dokumenten einsetzt.
SAXON
Der XSLT Prozessor von SAXON wurde von Michael Kay entwickelt und enthält alle wichtigen Komponenten eines Prozessors. Zusätzlich wurde noch eine Java-Bibliothek eingebaut , die es erlaubt Funktionen von XSLT in Java-Applikationen zu verwenden. Die neuste version von Saxon ist 7.5 welche einen Großteil der XSLT 2.0 und XPath 2.0 beinhaltet sich jedoch noch in der Entwicklungsphase befindet, und so einige Mengel aufzeigt. Aus diesen Grund ist es empfehlenswert mit der Version 6.5.2 zu arbeiten. Bei dieser wird XSLT 1.0 und XPath 1.0 unterstützt. SAXON enthät viele zusätzliche XSLT Erweiterungen, sogenannte elements bzw. extension functions.Diese Erweiterungen umfassen unter anderen einige EXSLT Bibliotheken , aber auch aufwendigere Funktionen , welche man nur bei Saxon finden kann.
Aufbau des XSLT Prozessors von SAXON :
[[Bild:S3makuba_Saxon.jpg|600px]|500px]]
Bestandteile und Funktionsweise:
Tree Constructor:
Der Tree Constructor ist dafür zuständig, aus einem XML Eingabedokument im Arbeitsspeicher eine Baumrepräsentation für die weitere Verwendung im XSLT Prozessor aufzubauen ( Bei SAXON hat der Constructor sowohl die Aufgabe eine Baumrepräsentation für das Quell Dokument als auch für das Stylesheet Dokument zu erzeugen).
Tree Navigator:
Der Tree Navigator dient dazu, in dem durch den vom Tree Builder erzeugten Baum, auf bestimmte Knoten zugreifen zu können.
Stylesheet Compiler:
Als Eingabe bekommt dieser Compiler den den vom Tree Constructor erzeugten Stylesheet-Baum. Diesen Compilert er zu einem Entscheidungsbaum (decision tree)welcher dem Interpreter als Eingabe dienen soll. Bei dieser Umwandlung des Baumes wurden sämtliche XPath Ausdrücke vollständig valiidiert und geparst und Querverweise aufgelöst (somit kann Interpreter schneller arbeiten).
Stylesheet Interpreter:
Der Kern des SAXON Prozessors liegt im Interpretert. Dieser nimmt den XML Quellbaum und den vom Compiler erstellten Entscheidungsbaum für die Eingabe. Als Ausgabe wird ein Ergebnisbaum (result tree) geliefert.
Outputter:
Der Outputter ist die letzte Komponente im SAXON Prozessablauf und ist für die Kontrolle des Ausgabeprozesses des result trees zuständig. Die Ausgabe des Outputter erfolgt mittels eines Serialisierers in eine Datei. Dieser Serialisierer existiert für die Formate XML, HTML und Klartext, genauso wie es in der XSLT Empfehlung vom W3C definiert ist. SAXON erlaubt ebenfalls, den result tree an eigenen Programmcode zur weiteren Verarbeitung weiterzuleiten.
MSXML
Einen weiteren XSLT Prozessor findet man in dem SDK (Software Development Kit) MSXML. Diese Abkürzung steht für Microsoft XML Core Services . Dieser Prozessor wurde von Microsoft für die verarbeitung von XML Dokumenten programmiert. Vor der Version 4.0 war MSXML nur ein einfacher Parser , was Microsoft nach langer zeit zu einer SDK änderte. Die Aktuelle Version enthält alle Standards des W3C ( volle Kompatibilität zu XPath 1.0 und XSLT 1.0) , jedoch ist eine Kompatibilität zu XSLT 2.0 nicht vorgesehen.
Funktionsweise MSXML
1.Einlesen der Quell- und Stylesheet Dokumente
2.Umwandlung der Dokumente in DOM (Document Object Model) Repräsentationen
2.1.Einlesen des XML Dokumentes vom MSXML Parser
2.2.Weitergabe an MS DOM Builder und Überprüfung auf Gültigkeit und Wohlgeformtheit
2.3.Entfernung von unnötigen Leerzeichen und Aufbau des DOM Baumes im Speicher
3.Transformation durch XSLT Prozessor zu entgültigen Ergebnisbaum (result tree)
[[Bild:S3makuba_Unbenannt_1.jpg|500px]|400px]]
Transformationsprozess
Ein XSLT-Prozessor bekommt die Aufgabe einen Speziellen Stylesheet auf ein XML-Dokument anzuwenden. Der XSLT-Prozessor parst und liest beide Dokumente und legt im Speicher, für jedes Dokument, eine interne Baumstruktur an. Jetzt kann der Transformationsprozess beginnen. Die Stylesheets werden abgearbeitet. Die Stylesheets greifen auf die Quelldaten zu, der Umfang wie viel genutzt wird, beschreiben die Template Regeln. Diese verwendeten Quelldaten und die entwickelten Ergebniselemente liefern die Daten für den Ergebnisbaum. Durch Serialisierung wird aus dem Ergebnisbaum das Ergebnisdokument erzeugt, welche das Stylesheet anfordert z.B.: XML, XHTML, … .
Ein XSLT-Prozessor bekommt die Aufgabe einen Speziellen Stylesheet auf ein XML-Dokument anzuwenden. Der XSLT-Prozessor parst und liest beide Dokumente und legt im Speicher, für jedes Dokument, eine interne Baumstruktur an. Jetzt kann der Transformationsprozess beginnen. Die Stylesheets werden abgearbeitet. Die Stylesheets greifen auf die Quelldaten zu, der Umfang wie viel genutzt wird, beschreiben die Template Regeln. Diese verwendeten Quelldaten und die entwickelten Ergebniselemente liefern die Daten für den Ergebnisbaum. Durch Serialisierung wird aus dem Ergebnisbaum das Ergebnisdokument erzeugt, welche das Stylesheet anfordert z.B.: XML, XHTML, … .
Bei dem Beginn der Transformation bearbeitet der XSLT-Prozessor immer die Template-Regeln des Wurzelknotens des XML-Baums. Die Reihenfolge in der die Template-Regeln in die Stylesheets eingetragen sind spielt keine Rolle. Der Prozessor sucht sich immer die Template-Regel raus, welche genau für den Wurzelknoten definiert worden ist oder sich dafür verwenden lässt. Ist in einer Template-Regel eine Anweisung, welche nicht genauer spezifiziert werden kann und den maßgeblichen Kontext für diese Anwendung gibt, gefunden so wird es eine Aufforderung für den XSLT-Prozessor. Es werden alle Kindknoten des aktuellen Knotens ausgewählt. In diesen Kindknoten wird nach genau dieser Template-Regel gesucht oder eine die darauf passt um diese Regel anzuwenden. Besitzt der Kindknoten keine Template-Regel verwendet der XSLT-Prozessor, zumindest im Notfall, eine eingebaute Regel. Die Notfall-Regel trifft nicht nur im Wurzelknoten zu sondern in allen Elementknoten. Diese Regel ruft die Anweisung einfach noch einmal auf.
<apply templates></apply>
Stylesheets,Template-Regeln und Konfliktlösung
XSLT Stylesheets
Definition von XSLT Stylesheets
Ein XSLT Stylesheet ist ein XML Dokument und besitzt auch diese Deklaration. es muss ausserdem immer Wohlgeformt sein. Das Wurzel Element kann entweder "xsl:stylesheet" oder " xsl:transform " sein. Da alle XSLT Dokumente im Namensraum http://www.w3.org/XSL/Transform liegen ,werden sie an den Präfix "xsl:" gebunden.
Beispiel für XSLT Stylesheets
Als Quelldokument wird das Beispiel "filmliste.xml" genommen.
Beispieldokument filmliste.xml
Ein einfaches XSLT Stylesheet zur Transformation in eine HTML Datei könnte in etwa so aussehen:
Aufbau eines XSLT Stylesheets
Wie jedes XML Dokument, beginnt auch das Stylesheet mit der Umlautdeklaration und der genutzten XML Version.
Danach wird das <stylesheet> Element eingefügt oder auch für seltene Fälle das Synonym <transform>.
Hierbei ist wichtig zu sagen , das <transform> genutzt wird um Dokumente die nur Daten enthalten umzuwandeln und nicht zur
Formatierung ausgelegt ist. Bei jedem XSLT Stylesheet muss zusätzlich der Namensraum angegeben werden.</transform></transform></stylesheet>
<stylesheet version="1.0" xmls:xsl="http ://www.w3.org/1999/XSL/Transform"></stylesheet>
Um die Transformation durchführen zu können , muss man eine Verbindung vom Quelldokument zum Stylesheet Dokument einbauen.
Innerhalb dieses Gerüstes stehen die Kindelemente (Top-Level-Elemente) :
Befehl erweitert die Funktionalitäten des importierenden Stylesheets. Bei Konflikten zwischen Regeln des importierenden Stylesheets und des importierten Stylesheets so werden die importierten Stylesheets nachrangig behandelt.
<import></import>
Befehl ladet XSL Befehle des aufgerufenen Stylesheets von einem Remote-Host direkt in den Code.
<include></include>
Befehl gibt die Möglichkeit, Namensraum Pseudonyme zu verwenden.
<namespace-alias></namespace-alias>
Befehl lässt alle (Attribut elements) des Befehls xsl:strip-space aufgeführten Elemente einer XML-Instanz im Output ihren Leerraum verlieren.
<strip-space></strip-space>
Befehl lässt alle (Attribut elements) des Befehls xsl:strip-space aufgeführten Elemente einer XML-Instanz im Output ihren Leerraum behalten.
<preserve-space></preserve-space>
Befehl xsl:output gibt für den Ergebnisbaum den Dokumenttyp vor, gängige Parameter sind text, xml oder html. Diese werden im Attribut method gesetzt, Standard ist bei XML als encoding UTF-8.
<output></output>
Befehl bezeichnet ein bestimmtes Suchmuster, welches auf ein Element und den Wertebereich eines bestimmten Attributes zutrifft.
<key></key>
Befehl gibt das Zahlenformat im Ergebnisdokument an.
<decimal-format></decimal-format>
Befehl fasst mehrere Attribute zu einem Set zusammen. Der Name des attribute-set muss ein gültiger XML Name sein.
<attribute-set></attribute-set>
Befehl xsl:variable definiert eine Variable innerhalb eines Templates oder als direktes Kindelement von xsl:stylesheet kann es auch globale Variablen definieren. xsl:variable erzwingt das Attribut name, zusätzlich kann auch ein select Attribut genutzt werden
<variable></variable>
Befehl xsl:with-param wird innerhalb von xsl:call-template oder xsl:apply-templates Anweisungsblöcken verwendet. Dabei referenziert der im name Attribut gesetzte Parameter (der ein gültiger XML Name sein muß) auf den entsprechenden Parameter innerhalb des aufgerufenen Templates, der mit xsl:param gesetzt wurde.
<param>
Befehl xsl:template mit dem erzwungenen Attribut match beschreibt mit dem Wert des Attributes match jenen Knoten, auf den ein Suchmuster definiert werden soll. XSLT-Befehle dürfen in der Befehlshierarchie nur unterhalb dieses Befehls eingesetzt werden.
Template-Regeln
Template-Regeln sind Schablonen zur Transformation des Quellbaums (source tree) in den Ergebnisbaum (result tree). Sie setzen sich aus den zwei Bestandteilen, Pattern (Suchmuster) und Template (Ersetzungsmuster)zusammen.

