Einführung in die XML-Technologien XPath, XSLT und XQuery/XSLT

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

Autoren
* Gino Napierala ([mailto:s3ginapi@stud.hs-zigr.de s3ginapi@stud.hs-zigr.de])
* Martin Kubasch ([mailto:s3makuba@stud.hs-zigr.de 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. 

[[Bild:S3makuba_Xslt.jpg]]

== 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(link) 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 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 ==

<language>XSLT</language>
== 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.

<popup name = "Beispieldokument filmliste.xml">
<code id="4ef9e82aad7a8">
<filmliste>

<film id="1">
    <titel>Die Rueckkehr der Jedi-Ritter</titel>
    <genre>Science-Fictio</genre>
    <oscars>1</oscars>
    <regie>
        <regisseur>Richard</regisseur>
    </regie>
    <jahr>1983</jahr>
</film>
    
<film id="2">
    <titel>Sin City</titel>
    <genre>Thriller</genre>
    <oscars>0</oscars>
    <regie>
         <regisseur>Frank Miller</regisseur>
         <regisseur>Robert Rodriguez</regisseur>
         <regisseur>Quentin Tarantino</regisseur>
    </regie>
    <jahr>2005</jahr>   
</film>
    
<film id="3">
     <titel>Forrest Gump</titel>
     <genre>Drama</genre>
     <oscars>6</oscars>
     <regie>
         <regisseur>Robert Zemeckis</regisseur>
     </regie>
     <jahr>1994</jahr>
</film>
    
<film id="4">
     <titel>The Dark Knight</titel>
     <genre>Action</genre>
     <oscars>2</oscars>
     <regie>
         <regisseur>Christopher Nolan</regisseur>
     </regie>
     <jahr>2008</jahr>
</film>
    
<film id="5">
      <titel>Avatar</titel>
      <genre>Science-Fiction</genre>
      <oscars>3</oscars>
      <regie>
          <regisseur>James Cameron</regisseur>
      </regie>
      <jahr>2009</jahr>
</film>

</filmliste>
</code>
</popup>




Ein einfaches XSLT Stylesheet zur Transformation in eine HTML Datei könnte in etwa so aussehen: 




<run id="4f0480f349d60"><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html"/>
	<xsl:template match="/">
		<html>
			<head>filmliste</head>
			<body>
				<h1>Die große Filmliste:</h1>
				<xsl:apply-templates select="/filmliste/film"/>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="film">
		<h3>
			<xsl:value-of select="@id"/>
		</h3>
		<p>Titel: <xsl:value-of select="titel"/>
		</p>
		<p>Genre: <xsl:value-of select="genre"/>
		</p>
		<p>Oscars: <xsl:value-of select="oscars"/>
		</p>
		<p>Jahr: <xsl:value-of select="jahr"/>
		</p>
	</xsl:template>
</xsl:stylesheet></run>


'''Aufbau eines XSLT Stylesheets'''



Wie jedes XML Dokument, beginnt auch das Stylesheet mit der Umlautdeklaration und der genutzten XML Version.

 <?xml version="1.0" encoding="ISO-8859-1"?>
 
<br/>
<br/>
Danach wird das <xsl:stylesheet> Element eingefügt oder auch für seltene Fälle das Synonym <xsl:transform>.
Hierbei ist wichtig zu sagen , das <xsl: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.

 <xsl:stylesheet version="1.0" xmls:xsl="http ://www.w3.org/1999/XSL/Transform">
<br/>
<br/>
Um die Transformation durchführen zu können , muss man eine Verbindung vom Quelldokument zum Stylesheet Dokument einbauen.

 <?xml-stylesheet type="text/xsl" href="(stylesheetname).xslt">




''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.

 <xsl:import/>


Befehl ladet XSL Befehle des aufgerufenen Stylesheets von einem Remote-Host direkt in den Code.

 <xsl:include/>


Befehl gibt die Möglichkeit, Namensraum Pseudonyme zu verwenden.
 
 <xsl:namespace-alias/>


Befehl lässt alle (Attribut elements) des Befehls xsl:strip-space aufgeführten Elemente einer XML-Instanz im Output ihren Leerraum verlieren.
 
 <xsl:strip-space/>


Befehl lässt alle (Attribut elements) des Befehls xsl:strip-space aufgeführten Elemente einer XML-Instanz im Output ihren Leerraum behalten.
 
 <xsl: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.
 
 <xsl:output/>


Befehl bezeichnet ein bestimmtes Suchmuster, welches auf ein Element und den Wertebereich eines bestimmten Attributes zutrifft.
 
 <xsl:key/>


Befehl gibt das Zahlenformat im Ergebnisdokument an.
 
 <xsl:decimal-format/>
 

Befehl fasst mehrere Attribute zu einem Set zusammen. Der Name des attribute-set muss ein gültiger XML Name sein.

 <xsl: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
 
 <xsl: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.
 
 <xsl: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.
 
 <xsl:template/>


=== 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.

[[Bild:S3makuba_Template.jpg|300px|400px]]

== Programmierung mit XSLT ==

== Dokumenttransformation in XML, HTML und XHTML ==