Fragestunde: Neuerungen in XQuery und XSLT

Ähnliche Dokumente
IT-Zertifikat: Daten- und Metadatenstandards. Transformation von XML-Dokumenten mit XSLT (und XPATH) XSLT kurz und knackig. XSLT und die Praxis

Projektseminar Texttechnologische Informationsmodellierung

XML-QL. Querysprachen für XML. Semistrukturierte Datenmodell und XML Datenmodell. Beispiel

Transformation von XML-Dokumenten. IDE SummerSchool 2013, Chemnitz

XML and Semantic Web Technologies

Institut für Dokumentologie und Editorik. XML-Datenbanken und XQuery

XSL und XSLT. Inhalt. Mathias Heilig XSL Übersicht. Formatierungsprozess. Sprachbeschreibung. Vorführung Resümee

3.1 Sinn und Zweck von Namensräumen

Klaus Schild, XML Clearinghouse Transformation von XML-Dokumenten

CARL HANSER VERLAG. Dirk Ammelburger XML. Grundlagen der Sprache und Anwendungen in der Praxis

XML-Verarbeitung. XPath XSL die extensible Stylesheet Language. Torsten Schaßan SCRIPTO Modul 4: EDV Wolfenbüttel

Datenbanksysteme. XML und Datenbanken. Burkhardt Renz. Sommersemester Fachbereich MNI Technische Hochschule Mittelhessen

Projektseminar "Texttechnologische Informationsmodellierung"

XSL Templates. Mit Templates arbeiten. XSL Templates

Universität zu Köln Informationsverarbeitung WS 2009/10. Datenbanken vs. Markup Prof. Dr. M.Thaller XML als Datenbank

XML 1. Einführung, oxygen. Ulrike Henny. IDE Summer School 2013, Chemnitz

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

Streaming Transformations for XML STX

8.3 Das Verarbeitungskonzept von XQuery

Einführung in Datenbanken - XML - Philipp Cimiano AG Semantische Datenbanken und Wissensverarbeitung

WordXML Datenfluß. Autor: Frank Eppinger Datum: Status: in Arbeit Version: 0.2

FileMaker Konferenz 2010 XML / XSLT. Ein Workshop mit [x] cross solution Armin Egginger

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN Kennnr. Matrikelnr. Familienname Vorname

2. Einführung in Datenbanken und XML

06 Formatierungssprachen, XSL. Manuel Burghardt Lehrstuhl für Medieninformatik

Inhaltsverzeichnis. Teil 1 Grundlagen 5. Teil 2 Formatierung 31 INHALTSVERZEICHNIS

Speicherung von XML in (objekt-)relationalen Datenbanken. Burkhard Schäfer

Kursinhalte. Kompakt-Intensiv-Training. XSL, XSLT, FO - Einstieg für XML

Web-Programmierung (WPR)

Ruhr.pm XML-Daten verarbeiten mit XML::LibXML Autor: Datum:

10. XML und XQuery. Prof. Dr.-Ing. Wolfgang Lehner

Dynamische Websites mit XML und PHP4

Semistrukturierte Daten

XML XPath XSLT. Wiederholung und Auffrischung. Ulrike Henny und Patrick Sahle. IDE Autumn School 2012, Chemnitz

Datenbankadministration

Allgemeines. veröffentlicht unter lizensiert unter. Creative Commons BY-SA 3.0. XQuery in MS SQL Server 2005

Single Source Publishing mit XML

Query Transformation based on XSLT

Strukturierung von Inhalten

A Datenbanken. A.1 Firebird. A.1.1 Installation des Servers. A.1.2 Installation der Beispieldatenbanken. Datenbanken 1

Gegeben ist das folgende XML-Dokument.

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Aufgaben zu XPath und XQuery

XML-Datenbanken. Autor: Nan Zhang Veranstaltung: XML in Bioinformatik

mach,, Benjamin Kurtz, Bastian Bonnermann

XML-Praxis. XML-Anwendungen. Jörn Clausen

C.3 Funktionen und Prozeduren

Extraktion relationaler Daten für das Semantic Web in Oracle 10g

Buchstabensuppe. Standards für die Präsentation von XML-Instanzen

Datenaustauschformate. Datenaustauschformate - FLV

Webseite in XML Kurzeinführung

Implementierung der XPath-Anfragesprache für XML-Daten in RDBMS unter Ausnutzung des Nummerierungsschemas DLN

X-Technologien. XML and Friends. Jörn Clausen 9. Juli 2001

Druckvorlage mit XSL FO

Verarbeitung von XML-Daten XSLT & XPath. Heiko Paoli (FZI)

Einführung in XML Torsten Schaßan SCRIPTO digital Wolfenbüttel

XQuery Implementation in a Relational Database System

Dynamische Generierung von XML

Berner Fachhochschule Software Schule Schweiz JDOM. Beatrice Amrhein. Oktober 06

Klausur zur Vorlesung Einführung in XML

XML Vorlesung ETHZ SS XQuery XML Vorlesung ETHZ SS XML Vorlesung ETHZ SS

XSLT: Anwendung und Einbindung in Applikationen am Beispiel einer Webanwendung zur Darstellung von Sendeplänen.

Verarbeitung von XML-Dateien. Jörn Clausen

XML Informationsmodelle

5. Programmierschnittstellen für XML

5. Programmierschnittstellen für XML

T:\Dokumentationen\Asseco_BERIT\Schulung\BERIT_LIDS7_Basiskurs\Impo rt_export\beritde_lt_do_ _lids7.basisschulung_import_export.

3 Kurzeinführung in Matlab

XML mit SAS leicht gemacht

Repetitorium Informatik (Java)

Einführung in XML. Von Klammern, Schachteln und gefüllten Keksen. Hier im Folienmaster Präsentationstitel eintragen

- Wiederholung/Übung -

Kapitel 33. Der xml-datentyp. In diesem Kapitel: Der xml-datentyp 996 Abfragen aus xml-datentypen 1001 XML-Indizierung 1017 Zusammenfassung 1023

... MathML XHTML RDF

2. XML 2.1 XML 1.0 und XML Schema. Jörg Schwenk Lehrstuhl für Netz- und Datensicherheit

XSLT (XSLT) Lernziele

Komplexe Transformationen mit XSLT

Fakultät für Informatik & Wirtschaftsinformatik DB & IS II - SS XMLType. Christian Senger/Andreas Schmidt XMLType 1/32

Einführung in XSL-FO

TEI! Und dann? Texttechnologische Standards in den Geisteswissenschaften - Encoding in TEI <

Kapitel 6: SQL und XML

Klausur Semistrukturierte Daten und XML Sommersemester 2009 Prof. Dr. Wolfgang May 16. Juli 2009, Uhr Bearbeitungszeit: 90 Minuten

Verwaltungsaufgaben lösen mit XML und L A T E X

Anhang B. B.1 Webseiten für Entwickler. Anwendungen

3 XSLT Einführung in die Transformationssprache

Aufgaben eines Codegenerators

XSLT Muster und Lösungen

Current Workflow. formatted. Rules. Extensions. Rules. DOM processing with Meta API-calls. Code Generation (Smarty) XMLfile. Source code.

Klausur zur Vorlesung Einführung in XML

Klaus Schild, XML Clearinghouse Aufbau von XML- Dokumenten

XML XML und Datenbanken XML-Abfragesprachen

Modell/Metamodell. Generated Source Code. Generator. Model. Fakultät für Informatik und Wirtschaftsinformatik MDSD - SS 2014

X-Technologien. Ein Überblick. Ulrike Henny. IDE Summer School 2013, Chemnitz

DTD: Syntax-Zusammenfassung

Daniel Koch XSLT. schnell + kompakt

XML/TEI eine Einführung

Transkript:

Seite 1, Druckdatum: 22.02.2006, 22:59 Uhr Fragestunde: Neuerungen in XQuery und XSLT Mit XQuery und XSL-T/XPath existieren zwei Ansätze zur Verarbeitung von XML Daten. Felix Sasaki & Jan-Torsten Milde Einleitung Der Artikel behandelt die W3C-Standards XQuery und XSLT, die zur Abfrage bzw. Transformation von XML-Dokumenten konzipiert wurden. Diese beiden Aufgaben entstammen unterschiedlichen Anwendungsszenarien: der datenbankorientierten Nutzung von XML versus der Verarbeitung von XML-basierten Textdokumenten im elektronischen Publikationsprozess. Die Unterschiedlichkeit der Szenarien führt dazu, dass viele Entwickler und Nutzer der jeweiligen 'Communities' nur einen der beiden Standards für notwendig halten. Der Artikel hingegen will die Gemeinsamkeiten von XQuery und XSLT herausstellen. Der vorliegende Artikel strebt keine komplette Beschreibung der Merkmale von XSLT und XQuery an. Der Leser sei hierfür an [1,2] verwiesen. Die gemeinsame Grundlage: das XPath 2.0 Datenmodell Die Basis zum Verständnis von XQuery und XSLT stellt das zugrundeliegende XPath 2.0 Datenmodell dar. Das Datenmodell repräsentiert XML Daten als eine Sequenz von Knoten und / oder atomaren Werten. Wichtig ist zu beachten, was vom Datenmodell nicht repräsentiert wird. So wird die Zeichenkodierung erst bei der Serialisierung der Daten verwendet. Weiterhin werden die Grenzen eine CDATA Section, Referenzen auf Entitäten, die DOCTYPE Deklaration und der interne DTD Subset nicht repräsentiert. Hierbei hängt es von der einbettenden Sprache ab (also z.b. XQuery oder XSLT), welche der Informationen erhalten bleiben und welche verloren gehen. Die auf dem Datenmodell aufsetzende Verarbeitungsweise von XQuery und XSLT sind einander sehr ähnlich. Beide Sprachen erwarten als Input 0 bis n XML Dokumente. Der Output sind 0 bis n XML Dokumente. Die eigentliche Ausgabe bzw. Serialisierung der Daten ist dabei ein vom Verarbeitungsprozess getrennter Schritt, der in einer separaten Spezifikation des W3Cs beschrieben wird[4,5]. Diese Spezifikation gibt eine beträchtliche Anzahl von Konfigurationsparametern vor. Allerdings verlangen XSLT und XQuery nur eine minimale Unterstützung der beschriebenen Serialisierungsmöglichkeiten. Hier kommt natürlich die Frage auf, was der Unterschied zwischen beiden Sprachen ist. Wir werden sie anhand des folgenden Beispiels beantworten. <meindok> <meinel meinattr="meinwert1"/> <meinel meinattr="meinwert2"/> </meindok> [Abb. Eingabedokument] <deinel deinattr="meinwert1"/> <deinel deinattr="meinwert2"/> [Abb. Ausgabedokument] Eingabe in die Verarbeitung ist das Dokument meindok.xml. Es besteht aus einem Element <meindok> welches zwei Elemente <meinel> enthält. Diese besitzen jeweils ein Attribut @meinattr. Die Aufgabe besteht nun darin, aus diesem Dokument ein Dokument "deindok.xml" zu

Seite 2, Druckdatum: 22.02.2006, 22:59 Uhr erzeugen. Es ist strukturell isomorph zu "meindok.xml" und unterscheidet sich nur hinsichtlich der Element- und Attributnamen. Das Verarbeitungsmodell von XSLT: Push Verarbeitung Zunächst zur Lösung der Aufgabe mit XSLT. Wichtigster Bestandteil der XSLT Verarbeitung sind Templates, die durch <xsl:template> Elemente dargestellt sind. Zur einfacheren Identifikation der Templates im Text haben wir @xml:id Attribute eingeführt, auf die wir im Folgenden Bezug nehmen. Eingabe in ein Temlate ist eine Sequenz von Knoten und / oder atomaren Werten, ein Teil des so genannten dynamische Kontexts. Der dynamische Kontext ist die Information, die bei der Verarbeitung einer XSLT-Anweisung zur Verfügung steht. Zum dynamischen Kontext kommt der statische Kontext, der unter anderem die im Stylesheet deklarierten Namensräume umfasst. Im Template wird die Knotensequenz, die sich aus dem dynamischen Kontext ergibt, abgearbeitet. Die Besonderheit liegt nun darin, dass die Reihenfolge der Templates nicht fest liegt. Sie hängt davon ab, welche Knotensequenz im dynamischen Kontext gerade zur Verfügung steht. Nehmen wir an, dass das folgende Stylesheet deindok.xml erzeugen soll: <xsl:stylesheet...> [Die Namensraumdeklarationen sind der übersichtlichkeit halber ausgespart.] <xsl:template match="/" xml:id="t1"> <xsl:apply-templates/> <xsl:template match="meinel" xml:id="t2"> <deinel deinattr="{@meinattr}"> <xsl:template match="meindok" xml:id="t3"> <xsl:apply-templates select=".//*" /> </xsl:stylesheet> [Abb. XSLT Stylesheet zur Erzeugung von "deindok.xml"] Der erste Knoten, der bei der Initialisierung der Stylesheetverarbeitung zur Verfügung steht, ist der Dokumentknoten von meindok.xml. Die Regel @match="/" trifft auf diesen Knoten. Das bedeutet, dass das Template "t1" als so genanntes initiales Template fungiert: es wird als erstes abgearbeitet. Im Template ist nur eine Anweisung in Form des Elements <xsl:apply-templates/> enthalten. Sie bewirkt, dass der dynamische Kontext verändert wird: mit einer weiteren Knotensequenz werden wieder neue Templates aufgerufen. Die neue Knotensequenz sind hier die Kindknoten des Dokumentknoten. Es gibt dabei natürlich nur einen Kindknoten, das Wurzelelement. Für diesen Knoten wird das Template "t3" mit der Regel @match="meindok" abgearbeitet. In diesem Template wird der erste Bestandteil von "deindok.xml" erzeugt: das Element. Als Inhalt des Elements steht die Anweisung <xsl:apply-templates select=".//*"/>. Der Unterschied zum vorhergehenden Aufruf von <xsl:apply-templates/> liegt im Attribut @select. Es beschreibt, welche Knotensequenz für die Bildung eines neuen dynamischer Kontext genutzt wird und für weitere Templates bereit steht. Im vorliegenden Fall ist es die Sequenz aller Elemente unterhalb es aktuellen Knotens, also unterhalb von <meindok>. Da dies in "meindok.xml" die beiden <meinel> Elemente Kindelemente von <meindok> sind, hätte man auch verkürzt <xsl:applytemplates/> schreiben können. Bei einem Eingabedokument, welches weitere, tiefer verschachtelte

Seite 3, Druckdatum: 22.02.2006, 22:59 Uhr <myel> Elemente enthält, würde jedoch nur die Variante von <xsl:apply-tempates select=".//*"/> alle diese Elemente erfassen. Für die <meinel> Elemente wird das Template t2 mit der Regel match="myel" abgearbeitet. Das Template wird zwei Mal durchlaufen, für jedes <meinel> Element einmal. Zur Ausgabe wird jeweils ein <deinel> Element hinzugefügt. Für jedes <deinel> Element wird ein Attribut @deinattr erzeugt. Seinen Wert erhält es vom Attribut @meinattr aus dem Eingabedokument. Diese Form der Verarbeitung wurde von Michael Kay, dem Autor der XSLT 2.0 Spezifikation und des XSLT / XQuery Prozessors Saxon [1], als Push Verarbeitung bezeichnet: einem XSLT Stylesheet wird als Teil des dynamische Kontexts eine Sequenz von Knoten hingeworfen nach dem Prinzip mal sehen, welches Template eine passende Regel hat. Die Templateverarbeitung damit hängt von der jeweiligen Eingabesequenz ab, sie ist also datengetrieben. Wenn es im Eingabedokument meindok.xml z.b. keine Kindknoten von <meindok> gibt, würden die Templates "t2" und "t3" nicht abgearbeitet. Das Verarbeitungsmodell von XQuery: Pull Verarbeitung Komplementär zur Push Verarbeitung ist die so genannte Pull Verarbeitung. Hierbei werden die zu verarbeitenden Knoten vom Programm aus der Eingabe gezogen. Die Abfolge der Verarbeitung hängt weitestgehend nicht von den Eingabedokumenten, sondern vor allem von der Anordnung der Anweisungen im Programm ab. Diese Verarbeiung wird anhand der folgenden XQuery Abfrage näher erklärt. Sie erzeugt die gleiche Ausgabe deindok.xml wie das bereits beschriebene XSLT Stylesheet. xquery version "1.0"; { let $input := doc("meindok.xml") for $elements in $input/meindok/meinel return <deinel deinattr="{$elements/@meinattr}"/> } [Abb. Pull Verarbeitung mit XQuery] Der erste Verarbeitungsschritt wird vollkommen unabhängig von einem Eingabedokument durchlaufen: In der Ausgabe wird ein Element erzeugt. Der Inhalt des Elements ist eine Folge von XQuery Anweisungen. Sie werden durch geschweifte Klammern abgegrenzt. Die erste Anweisung bindet eine Variable $input an den Dokumentknoten von meindok.xml. Man kann auch sagen: Die let Anweisung zieht oder pullt einen Knoten - oder eine Knotensequenz - aus einer Eingabe und bindet die Variable an diesen Knoten. Die folgende for Anweisung greift auf $input zurück und iteriert über den <meinel> Elementknoten aus $input, die unterhalb des Wurzelknotens <meindok> liegen. Die Variable $elements wird an diese Knoten gebunden. Der Unterschied zwischen for und let liegt demnach in der Iteration: die for Anweisung arbeitet alle Knoten der Sequenz nacheinander ab. Die folgende return Anweisung wird deshalb für jeden Knoten in $elements ausgeführt. Dabei werden <deinel> Elemente erzeugt. Sie erhalten jeweils ein Attribut @deinattr. Der Wert wird durch eine weitere XQuery Anweisung bestimmt: $elements/@meinattr zieht die Werte von @meinattr Attributen aus den Knoten in $elements. Da $elements die Elementknoten <myel> enthält, sind es die @meinattr Attribute von den <meinel> Elementen. Der zentrale Unterschied der XSLT und XQuery Verarbeitung sind die einer Anweisung zur Verfügung stehenden Informationen, d.h. die Art, wie der dynamische Kontext definiert und genutzt

Seite 4, Druckdatum: 22.02.2006, 22:59 Uhr wird. Bei XSLT können Anweisungen in einem Template auf alle Knoten zurückgreifen, die als dynamischer Kontext in das Template eingegeben wurden. Zur Bildung des dynamischen Kontextes eines Templates dient wie gesagt diese Knotensequenz. Aus dem dynamischen Kontext heraus ist deshalb bei der Anweisung <deinel deinattr="{@meinattr}"> eindeutig, welche @meinattr Attribute verarbeitet werden: es sind das Attribut des <meinel> Elemente, welches aktuell im Template verarbeitet wird. Bei XQuery hingegen wird der dynamische Kontext einer Anweisung unter anderem aus den aktuell gebundenen Variablen heraus bestimmt. In der XQuery Anweisung steht für die Anweisung {$elements/@meinattr} die Variable $elements zur Verfügung. Die geschweiften Klammern lösen die Evaluierung des Ausdrucks aus, wodurch der Wert des @meinattr Attributs ausgelesen werden kann. Gemeinsam ist beiden Verarbeitungsweisen Push und Pull, und auch den beiden Sprachen XSLT und XQuery, die Nutzung von XPath 2.0. Mittels XPath werden Knoten zur weiteren Verarbeitung selektiert. Die Selektion erfolgt über Funktionen, Pfadausdrücke oder Filterausdrücke. Daumenregel: Wann XSLT, wann Xquery? Push Verarbeitung lässt sich leicht mit XSLT realisieren. Wann diese Verarbeitungsform angebracht ist, hängt von den Daten ab. In hohem Masse strukturierte, textuelle Daten mit vielen gemischten Inhaltsmodellen sind ideal für Push Verarbeitung mit XSLT geeignet. Nehmen wir z.b. das folgende <p> Element als Teil der Eingabe an: <para>meine <emph>grosse</emph> <note>und süsse</note> Blume.</para> Aus dieser Eingabe soll folgende Ausgabe erzeugt werden: <p>meine <em>grosse</em> (und süsse) Blume.</p> Mit XSLT ist diese Aufgabe einfach zu bewältigen: Jedes Element innerhalb von <p> wird mit einem entsprechendem Template verarbeitet, z.b. <xsl:template match="em">. In XQuery ist gemischter Inhalt schwer zu verarbeiten. Die Daumenregel lautet, XQuery für Pull Verarbeitung von Daten mit wenig gemischten Elementinhalten zu nutzen. Die Stärke von XQuery liegt in der kombinierten Verarbeitung mehrerer Knotensequenzen aus möglicherweise mehreren Eingabedokumenten. Der Mechanismus für diese Verarbeitung sind FLWOR Ausdrücke. Die Bezeichnung ergibt sich aus den Anfangsbuchstaben der Teilausdrücke: (f)or bindet Knotensequenzen an Variablen und iteriert über diese; (l)et bindet Knotensequenzen ohne Iteration; (w)here beschreibt eine Filterbedingung; (o)rder-by definiert ein Ordnungskriterium; (r)eturn gibt Sequenzen zurück. Diese Operationen sind zwar auch mit XSLT realisierbar. Die XML Repräsentation von XSLT führt dann allerdings schnell zu unübersichtlichem Programmcode. Die folgende Liste fasst die Unterschiede zwischen XSLT und XQuery Verarbeitung zusammen. Grundprinzip XSLT: Templates "warten" auf matchende Knotensequenzen, die sich aus dem dynamischen Kontext ergeben XQuery: Anweisungen "ziehen" Informationen aus den Eingabesequenzen Abfolge der Verarbeitung XSLT: Datengetrieben, d.h. abhängig vom Eingabedokument XQuery: Weitgehend unabhängig vom Eingabedokument, nur die Reihenfolge der Anweisungen zählt Dynamischer Kontext:

Seite 5, Druckdatum: 22.02.2006, 22:59 Uhr XSLT: Im wesentlichen eine Knotensequenz, die im aktuellen Template verarbeitet wird bzw. sich aus der Verarbeitung von XPath Ausdrücken ergibt. Kann durch <xsl:apply-templates> verändert werden XQuery: Im wesentlichen Knotensequenzen, die sich aus aktuell gebundenen Variablen und der Auswertung von XPath Ausdrücken ergeben XPath 2.0 Nutzung XSLT: Nutzung aller Pfad- und Filterausdrücke, Funktionen und Operatoren. Zur Template Auswahl / Veränderung des dynamischen Kontexts: Nutzung von XSLT "Pattern". XQuery: Nutzung aller Pfad- und Filterausdrücke, Funktionen und Operatoren [Kasten: Unterschiede der Verarbeitung mit XSLT und Xquery] Zum Schluss soll ein kombiniertes Anwendungsbeispiel von XQuery und XSLT stehen. Die in XQuery implementierte Funktion eg:checkuniqueness überprüft die Einzigartigkeit von ID Attributen und gibt eine Fehlermeldung wieder. Von XSLT aus lassen sich solche Funktionen aufrufen, wenn dies vom entsprechenden Prozessor (z.b. Saxon) unterstützt wird. xquery version "1.0"; module namespace eg = "http://example.com#"; declare function eg:checkuniqueness ($inputsequence as item()*) as item()* { for $node in $inputsequence//element() for $comparednodes in $inputsequence//element() except $node where $comparednodes/@id = $node/@id return "Fehler! ID bereits definiert"}; Resumee Die Entscheidung, welche der beiden vorgestellten Sprachen man für eine spezifische Aufgabenstellung verwendet, ist nicht ganz einfach. Als Daumenregel gilt, dass (rekursive) Funktionen, die viele Datenquellen zusammenführen, in XQuery einfacher zu formulieren sind. Querbezüge lassen sich leicht konstruieren, da im Pull Ansatz die Daten an Variablen gebunden werden, über denen anschliessend iteriert und gesucht werden kann. Die Verarbeitung von in hohem Masse strukturierten Daten mit gemischtem Inhalt lässt sich mit XSLT einfacher bewerkstelligen. Durch den datengetriebenen Ansatz der Push Verarbeitung können allgemeine Templates für unterschiedliche Knoten definiert werden, welche bei Bedarf aktiviert werden. Die kombinierte Nutzung der beiden Ansätze ist möglich, wobei aus XSLT heraus selbstdefinierte XQuery Funktionen aufgerufen werden können. Links & Literatur [1] Micheal Kay, XSLT Reference, 2 nd Edition, Hungry Minds Inc. [2] Wolfgang Lehner, Harald Schöning, XQuery, dpunkt Verlag, 2004 [3] XSL-TSpezifikation: http://www.w3.org/tr/xslt [4] Serialisierung: http://www.w3.org/tr/xslt-xquery-serialization/ [5] Serialisierung: http://www.w3.org/tr/xslt-xquery-serialization/#serparam [6] Wolfgang Lezius, XPath, Artikel im XML Magazin [7] Heinz Wittenbrink, Werner Köhler, XML, SPC Lehrbuch, Berlin