Java-Werkzeuge zur Verarbeitung von XML: Ein Vergleich 1. Einleitung und Motivation ........................................................................................................................ 2 2. Repräsentation per Data-Binding ............................................................................................................. 5 2.1. Prinzip ................................................................................................................................................ 5 2.2. Implementierung und Verwendung in Java ....................................................................................... 6 2.2.1. JAXB ............................................................................................................................................. 6 2.2.2. XMLBean ..................................................................................................................................... 7 3. Generische Repräsentation....................................................................................................................... 8 3.1. Represäntation als Datenbaum ......................................................................................................... 8 3.1.1. Prinzip DOM ................................................................................................................................ 8 3.1.2. Implementierung und Verwendung in Java ................................................................................ 8 3.2. Repräsentation als Ereignisstrom .................................................................................................... 11 3.2.1. Prinzip ....................................................................................................................................... 11 3.2.2. Implementierung und Verwendung in Java ............................................................................. 11 4. Spezialisierte Programmiersprachen ...................................................................................................... 13 4.1. XPath ................................................................................................................................................ 13 4.1.1. Prinzip ....................................................................................................................................... 13 4.1.2. Implementierung und Verwendung in Java .............................................................................. 14 4.2. XQuery ............................................................................................................................................. 15 4.2.1. Prinzip ....................................................................................................................................... 15 4.2.2. Implementierung und Verwendung in Java .............................................................................. 16 4.3. XSLT .................................................................................................................................................. 16 4.3.1. Prinzip ....................................................................................................................................... 16 4.3.2. Implementierung und verwendung in Java .............................................................................. 17 5. Entscheidungshilfe und Bewertung ........................................................................................................ 18 6. Fazit und Ausblick ................................................................................................................................... 20 1 1. Einleitung und Motivation Jeder der sich schon einmal mit XML beschäftigt hat, kennt das Problem: Welche Technik soll zur Verarbeitung des XML-Dokumentes verwendet werden? Bevor auf diese Frage eingegangen wird, folgt noch eine kurze Einführung in XML. XML steht für eXtensible Markup Language und ist am 10.02.1998 vom World Wide Web Consortium (W3C) standartisiert worden. Hierbei handelt es sich nicht um eine Programmiersprache, sondern um eine Sprache, die Informationen definiert und strukturiert. Sogar jemandem, der noch nie etwas mit Informatik zu tun hatte, wird es möglich sein, XML zu verstehen. XML repräsentiert Daten in einer Baumstruktur, was wahrscheinlich der Grund ist, warum die Sprache so einfach zu verstehen ist. Die Sprache besteht im wesentlichen aus Elementen und Attributen, wobei die Namen jener frei wählbar sind. Wer schonmal mit HTML in Kontakt getreten ist, dem wird XML ziemlich bekannt vorkommen. Im Folgenden wird ein Beispiel für ein XML-Dokument gezeigt, welches im Laufe dieser Arbeit immer wieder Verwendung findet. Die Logische Struktur eines XML-Dokumentes ist die Anordnung in einem Baum, wobei die Elemente diese Baumes Knoten genannt werden. Jeder Knoten kann beliebig viele Attribute enthalten. Viele syntaktische Vorgaben besitzt XML nicht. Die Elemente werden in spitze Klammern gesetzt und wenn sie enden, sind sie zusätzlich mit einem Schrägstrich versehen(„<>“; „</>“). Attribute eines Elementes befinden sich innerhalb dieser Spitzen Klammern und werden dort mit einem Namen und einem zugehörigen Wert hinterlegt. 2 Beispiel für ein XML-Dokument: „seminararbeit.xml“ <?xml version="1.0" encoding="UTF-8"?> <Buecher anzahl=“3“> <Buch> <Titel>Java ist auf eine Insel</Titel> <Autor> <Vorname>Christian</Vorname> <Nachname>Ullenboom</Nachname> </Autor> <ISBN>978-3-8362-1802-3</ISBN> </Buch> <Buch> <Titel>Einstieg in XML</Titel> <Autor> <Vorname>Helmut</Vorname> <Nachname>Vonhoegen</Nachname> </Autor> <ISBN>978-3-8362-1711-8</ISBN> </Buch> <Buch> <Titel>Java und XML</Titel> <Autor> <Vorname>Michael</Vorname> <Nachname>Scholz</Nachname> </Autor> <Autor> <Vorname></Vorname> <Nachname>Niedermeier</Nachname> </Autor> <ISBN>978-3-8362-1308-0</ISBN> </Buch> </Buecher> Um bei XML Einschränkungen in der Struktur zu machen, gibt es die Mögichkeit Document Type Definitions(DTD) zu verwenden. Diese Technologie wird hier aber nicht näher erläutert, da sie nicht mehr weiterentwickelt wird und durch eine bessere und umfangreichere abgelöst wurde. Hier ist die Rede von XML-Schema(Xsd). Schemas sind weitaus mächtiger als DTDs, da sie nicht nur die Struktur eines XML-Dokumentes vorgeben können, sondern auch Einschränkungen der Textinhalte durch Datentypen(integer, string, Längenbegrenzungen. 3 etc), reguläre Ausdrücke oder Beispiel für ein XML-Schema: „seminararbeit.xsd“ <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="Buecher"> <xs:complexType> <xs:sequence> <xs:element name="Buch" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Titel" type="xs:string" /> <xs:element name="Autor" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Vorname" type="xs:string" /> <xs:element name="Nachname" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="ISBN" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Dieses Schema definiert ein Element „Buecher“ welches in einem XML-Dokument nur einmal vorkommen darf. Teil des Elementes „Buecher“ ist wiederum ein anderes Element „Buch“, welches im XML beliebig oft innerhalb von „Buecher“ auftreten darf. Das Element „Buch“ beinhaltet drei weitere Elemente: Titel, Autor und ISBN, wobei ersteres und letzteres im XMLDokument String-Inhalte haben müssen. Zurück zur eigentlichen Frage, zur Wahl der optimalen Technologie. Die Antwort auf diese Frage ist nicht einfach, denn es gibt viele Möglichkeiten. In dieser Arbeit wird versucht dem JavaProgrammierer aufzuzeigen, welche Möglichkeiten er überhaupt hat. Die meisten kennen zwar viele Techniken, nutzen aber nur eine oder zwei, da sie mit ihnen vertraut sind und die speziellen Vorteile der anderen vielleicht gar nicht kennen. Viele Leute haben auch einfach keine Zeit, sich in alternative Techniken einzulesen, weil zum Beispiel der strikte Zeitplan des 4 Projektes es nicht zulässt oder man nicht die Zeit zur Verfügung gestellt bekommt, sich in diese Richtungen fortzubilden. 2. Repräsentation per Data-Binding 2.1. Prinzip Bei Data-Binding werden XML-Strukturen durch Klassen und Interfaces dargestellt. Ein Element in XML stellt nachher in Java eine Klasse oder ein interface da. Unterelemente werden als Membervariablen in den Klassen der übergeordneten Elemente angelegt. Zugriffe auf diese Unterelemente und Attribute werden von Getter- und Setter-Methoden gesteuert. Auf diese Weise fühlt sich alles an wie vertrautes Java, weil man quasi von der XML-Ebene entfernt ist. Im Regelfall ist bei der Variante des Data-Bindings eine Schemadatei vorhanden. Aus dieser Datei können dann komplexe Objektstrukturen generiert werden. Durch die Nutzung solcher Schemadateien wird die Typsicherheit gewährleistet. Wenn die Schemadatei vorgibt, dass ein Element den Typ „xs:string“ hat, dann verlangt die Setter-Methode einen String als Übergabe und die Getter-Methode einen String als Rückgabe. Das Überführen von XML in Objektstrukturen nennt man Unmarshalling oder Deserialisierung. Aber was macht man, wenn kein Schema vorliegt? Das könnte durchaus ein Problem sein. Jetzt ist der Entwickler gefragt. Er hat die Möglichkeit selber ein Schema zu erstellen und daraus dann Java-Code generieren zu lassen oder den Java-Code selber zu schreiben, was ein großer Aufwand sein kann. Ein weiterer Nachteil den die Data-Bindings mit sich bringen ist, dass durch das Erzeugen der Objektstrukturen bei großen XML-Dokumenten, die Speicher- und Prozessorlast stark zunimmt. 5 2.2. Implementierung und Verwendung in Java 2.2.1. JAXB Wie schon gesagt, kann aus Schemadateien, Java-Code generiert werden. Natürlich kann die Java Architecture for XML Binding (JAXB) das auch. JAXB ist ein Java Standard und deswegen ziemlich einfach zu nutzen. Beispiel für generierten code von JAXB Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 6 2.2.2. XMLBean XMLBean ist neben JAXB wohl die populärste Technologie.Es ist ein OpenSource Projekt welches von Apache ins leben gerufen wurde. Aber warum sollte XMLBean verwendet werden, wenn JAXB sogar ein Java Standard ist? Da XMLBean nach dem Umwandeln in Java-Code, das XML behält, ist es hier möglich XPath und XQuery mit in die Verarbeitung einzubeziehen. Dieser Aspekt ist ein riesiger Vorteil gegenüber JAXB. XPath und XQuery werden im weitern Verlauf der Arbeit noch näher erläutert. Ein wesentlicher Nachteil von XMLBean ist, dass es für alle Elemente und Typen – die im Schema definiert sind – Klassen und Interfaces anlegt, wodurch dann erhebliche CodeAbhängigkeiten entstehen. Bei XMLBean werden drei APIs angeboten: XmlObject für den Zugriff auf alle im Schema definierten Elemente, XMLCursor, der den Zugriff auf die XML-Daten regelt und schließlich SchemaType, welches den Zugriff auf die Schema-Metainformationen ermöglicht, wie z.B. zulässige Werte einer Enumeration. Die XMLCursor API unterstützt die Nutzung von XPath und XQuery durch die Methoden selectPath und execQuery Beispiel für generierten code von XMLBean Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 7 3. Generische Repräsentation 3.1. Represäntation als Datenbaum 3.1.1. Prinzip DOM Während Data-Binding das XML-Dokument durch spezifische Objekte repräsentiert(Für jedes Element im XML werden Klassen mit gleichem Namen im Java Code angelegt), verwendet DOM generische Klassen wie „Document“, „Element“ oder „Attribute“. Diese Klassen spiegeln genau die Elemente wieder, wie sie bei XML vorkommen können. Im Allgemeinen gesagt, ist DOM ein API, welches aus mehreren Interfaces besteht, die die teile eines XML Dokumentes repräsentieren. Das Document Object Model repräsentiert ein XML-Dokument als Datenbaum welcher in den Arbeitsspeicher geladen wird. Das DOM ist ein Java Standard und kann wie JAXB relativ einfach implementiert werden. Einmal im Arbeitsspeicher, kann überall in dem Baum auf Elemente zugegriffen werden, wobei hier nicht nur gelesen werden kann, sondern auch Daten manipuliert werden können. Der Baum muss als Objektstruktur für die gesamte Dauer der Dokumentverarbeitung im Speicher gehalten werden. 3.1.2. Implementierung und Verwendung in Java 1Im folgenden Beispiel wird JAXP(Java API for XML Parsing) verwendet. JAXP ist eine Abstaktionsschicht, die über verschiedenen Technologien liegt(DOM 3rd level, SAX 2.0.2, StAX, XSLT 1.0 und XPath 1.0). Durch diese API ist es dem Programmierer möglich, einfach den Parser zu wechseln, ohne den eigentlichen Code zu verändern. 1 http://openbook.galileocomputing.de/javainsel/javainsel_16_003.html 8 Beispiel für JAXP Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 3.1.2.1. JDOM Hier stellt sich wieder die Frage: Warum denn etwas anderes nehmen als DOM? Es ist ja schließlich ein Java Standard. 2JDOM(Java DOM) ist speziell für Java entwickelt worden und somit nicht mehr sprachenunabhängig, wie es DOM eigentlich ist. 3Trotz der eher stockenden Entwicklung erfreut sich JDOM immer noch einer großen Beliebtheit. JDOM nutzt die Collection-API von Java und erzielt dadurch eine bessere Performance als DOM, welches keine Rücksicht auf JavaDatenstrukturen nimmt. Es ist noch wichtig zu nennen, dass JDOM die SAX-API und einen Parser(meist Xerces oder Crimson) nutzt um den Baum im Speicher aufzubauen. Das JDOM API beinhaltet eine Factory-Klasse(SAXBuilder), während DOM keine Besitzt und auf die vom JAXP API zurückgreifen muss. 2 3 http://openbook.galileocomputing.de/javainsel/javainsel_16_003.html 1.0 Sep 2004; 1.1 November 2007; 1.1.1 Jul 2009; 1.1.2 Okt 2011 http://www.jdom.org/news/index.html 9 Beispiel für JDOM Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 3.1.2.2. dom4j Der große Vorteil von dom4j gegenüber JDOM ist, dass XPath Ausdrücke unterstützt werden. Dadurch ist es möglich die relevanten Daten zu selektieren. Andernfalls müsste über aufwändige Interationen per Java-Code gefiltern werden. Einfaches Beispiel für dom4j Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 10 3.2. Repräsentation als Ereignisstrom 3.2.1. Prinzip Bei den Streaming-Varianten ist kein wahlfreier Zugriff auf die Elemente möglich. Anders als bei DOM, läuft der Parser stupide durch das Dokument. Außerdem sind die Streaming-Varianten auf das Lesen der XML Daten beschränkt und können nicht wie bei DOM Daten manipulieren. Weil hier aber während der Laufzeit schon übermittelt und geparst wird, werden schon behandelte Elemente – sofort nach ihrer Benutzung – weggeworfen und vom garbage collector verschluckt, wodurch weniger Speicher- und Prozessorlast vorliegt als bei DOM. Auf der einen Seite ist dies ein großer Vorteil gegenüber DOM, auf der anderen Seite hat das Streaming auch einen großen Nachteil, da nur eine reduzierte Sicht auf die Elemente möglich ist, nämlich nur auf die aktuell behandelten Elemente. Genau dieser Aspekt ist eine große Gefahr, da XMLDokumente für das Streaming nicht wohlgeformt sein müssen. 3.2.2. Implementierung und Verwendung in Java 3.2.2.1. SAX 4SAX arbeitet nach dem Push-Prinzip. Der Parser ruft nach dem Callback-Prinzip selbstgeschriebene Methoden auf, sobald erkannte Elemente vorkommen, welche dann Ereignisse auslösen. Der Programmierer muss zwei Komponenten zur Verfügung stellen, nämlich den Produzenten und den Konsumenten. Der Produzent ist im unteren Beispiel die Klasse „TestSAX“ und der Konsument ist die Klasse „ContentHandler“. Für ein einfaches Beispiel wie hier, muss der Produzent lediglich einen Parser anlegen. Diesem muss dann noch der Konsument zugewiesen werden und das zu parsende Dokument muss angegeben werden. Außerdem hat man beim Produzenten noch die Möglichkeit den Parser zu konfigurieren Der „ContentHandler“ ist ein wenig aufwändiger. Hier wird entschieden was mit bestimmten Elementen geschehen soll. Die wichtigsten Ereignisse, die bei SAX eintreffen sind: StartDocument, endDocument, startElement und endElement, welche über das Interface ContentHandler als Methoden des selbstgeschriebenen ContentHandlers eingebunden werden. Wichtig ist hier, dass diese Methoden alle während des Parsens vom XMLReader aufgerufen 4 http://vsr.informatik.tu-chemnitz.de/proseminare/xml04/doku/sax/ 11 werden. Darüber hinaus gibt es einige andere Ereignisse auf die der „ContentHandler“ reagieren kann. Beispiel für SAX Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 3.2.2.2. StAX Bei StAX werden nicht wie bei SAX, Methoden bereitgestellt die vom Parser aufgerufen werden, sondern immer aktiv der nächste Teil des XML-Dokumentes angefordert. Hierbei wird zwischen Cursor und Iterator unterschieden, wobei der Iterator flexibler, aber aufwändiger zu programmieren ist. 12 Beispiel für StAX Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 4. Spezialisierte Programmiersprachen 4.1. XPath 4.1.1. Prinzip 5XPath ist eine Abfragesprache für XML-Dokumente. Es bietet die Möglichkeit durch die Elemente und Attribute eines XML-Dokuments zu navigieren. Außerdem bietet die Sprache viele Standardfunktionen6. XPath ist die Grundlage XSLT und XQuery. XPath interpretiert alles in einem XML-Dokument als Knoten. Insgesamt gibt es sieben verschiedene Knotentypen: Wurzelknoten, Elementknoten, Attributknoten, Textknoten, Kommentarknoten, Namespaceknoten und Processing-Instruction-Knoten. 5 6 http://www.w3schools.com/xpath/default.asp http://www.w3schools.com/xpath/xpath_examples.asp 13 Die Navigation erfolgt nun Schrittweise, getrennt durch Schrägstriche über die genannten Knoten. Dabei hat man die Möglichkeit in verschiedene Richtungen bzw. auf verschiedenen Achsen zu navigieren. Zum Beispiel kann zu dem Parent-Element(jedes XML-Element hat genau einen Parent) oder zu einem Child-Element navigiert werden, sprich eine Ebene höher oder eine Ebene tiefer in dem Datenbaum. XPath Ausdrücke geben immer eine Menge von Knoten zurück. Zu guter Letzt gibt es bei XPath die Möglichkeit Prädikate anzugeben. Prädikate geben immer boolsche Werte zurück, also wahr oder falsch. Trifft für einen Knoten aus der Ergebnismenge dieses Prädikat zu(wahr), bleibt der Knoten in der Menge, ist der Wert „falsch“, wird der Knoten entfernt. Prädikate sind also eine Möglichkeit das Ergebnis zu filtern. Ein Hilfsmittel zur Navigation stellen die vielen Standardfunktionen dar. 4.1.2. Implementierung und Verwendung in Java Beispiel für eine XPath Implementierung Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 14 4.2. XQuery 4.2.1. Prinzip Wie bereits im Abschnitt zuvor erwähnt wurde, ist XPath die Grundlage von XQuery. XQuery wurde designed um XML-Daten abzufragen. Sie ist für XML das, was SQL für Datenbanken ist. XQuery als Erweiterung von XPath: XPath hat lediglich die Möglichkeit bestehende Knoten zurückzuliefern, XQuery hingegen kann selbst welche erzeugen. Außerdem bietet XQuery das FLOWR Konstrukt, welches erlaubt, über die Daten zu iterieren und Zwischenergebnisse zu speichern. XQuery bietet die Möglichkeit benutzerdefinierte Funktionen zu erstellen. Beispiel für einen XQuery Ausdruck (Aufruf am seminararbeit.xml) Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 15 4.2.2. Implementierung und Verwendung in Java 4.3. XSLT 4.3.1. Prinzip XSLT steht für XSL Transformations. Da es bei HTML vordefinierte Tags gibt, weiß ein Browser wie er HTML-Code anzeigen muss. Das Problem bei XML ist, dass die Tags frei wählbar sind und der Browser dadurch nicht weiß, was er darstellen soll. XSLT benutzt XPath um durch XMLDokumente zu navigieren und transformiert XML-Dokumente in andere XML-Dokumente oder einfach nur Text. Durch die Transformation von XML-Dokumenten eröffnen sich große Möglichkeiten. Ein nennenswerter Aspekt ist z.B., dass per XSLT Daten aus XML gefiltert werden können und als HTML wieder ausgegeben werden können. Von XML zu HTML XSLT: <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:template match="/"> <html><table border="1"><tr><td>Autor</td><td>Titel</td><td>Abgabe</td></tr><tr> <td><xsl:value-of select="concat(//Vorname, ' ', //Nachname)" /></td> <td><xsl:value-of select="//Titel" /></td> <td><xsl:value-of select="/Seminararbeit/@abgabetermin" /></td> </tr></table></html> </xsl:template> </xsl:transform> HTML Ausgabe In dem obigen Beispiel wird eine einfache HTML-Tabelle mit zwei Zeilen aufgebaut. Die erste Zeile beinhaltet selbstgeschriebenen Text. Die zweite Zeile enthält die Inhalte von den 16 Elementen, die die XPath-Ausdrücke zurückliefern. In der ersten Spalte werden sogar die Textknoten konkateniert und dann zu einem String umgewandelt. Außer dem Hinzufügen oder Entfernen von Elementen und Attributen im Ausgangsdokument, kann über Elemente iteriert (for-each) oder sortiert(sort) werden. Zusätzlich können Entscheidungen(if, choose) getroffen werden um nur gewünschte Inhalte zu manipulieren. Über Schablonen(template) kann definiert werden, dass nur bestimmte Elemente verändert werden, nämlich jene, auf die der XPath-Ausdruck im „match“-Attribut der Schablone zutrifft. XSLT kann aber nicht nur genutzt werden um XML in HTML zu transformieren. Das Ausgabeformat könnte auch einfach wieder ein XML-Dokument sein oder reiner Fließtext. Einige erzeugen sich sogar Java-Code aus einem XML-Dokument mit Hilfe von XSLT. 4.3.2. Implementierung und verwendung in Java Einfaches Beispiel für XSLT Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 17 Rekursives Beispiel für XSLT Beispiel befindet sich im Anhang. Hier kommt ein anderes rein, da ich eine bessere Idee habe! 5. Entscheidungshilfe und Bewertung Es wurde deutlich, dass es keinen Königsweg gibt für die Wahl der Verarbeitungstechnik. Es kommt auf die verschiedenen Kriterien an, welche Technik zum Einsatz kommt. Im Folgenden werden die wesentlichen Vor- und Nachteile der einzelnen Technologien noch einmal hervorgehoben. 18 JAXB XMLBean DOM JDOM Dom4j SAX StAX XPath XQuery XSLT + + + + + - - + + + - - - - - + + + + + + + - - - - - - - - + + + + + - - Lesezugriff? + + + + + + + + + + Schreibzugriff? + + + + + - - - 7 - Aufwand - - + + + - - ++ ++ ++ ++ ++ + + + - - ++ ++ ++ ++ - ++ - - ++ + + + + Wahlfreier Zugriff möglich? Dokumentgröße unbegrenzt? Dateizugriff Typsicher? Ist eine gute Struktur gefordert? (+) einfache Lesezugriffe? Aufwand komplexe Auswertungen? Sollen Java Standards genutzt werden 7 Nur mit XQuery Update Facility 19 6. Fazit und Ausblick Auf die Frage, welche Technik die optimale ist, kann keine konkrete Antwort gegeben werden. Es ist viel mehr eine Frage davon, welche Eingangssituation vorliegt und wie sich das Ergebnis verhalten soll. Sollen z.B. Java Standards verwendet werden dann würden XMLBean, dom4j und JDOM als Möglichkeit entfallen. Wiederum sind andere wie XPath, XQuery und XSLT nur in nicht aktuellen Versionen verfügbar. Für den Fall, dass riesige Dateien vorliegen, bleibt kaum eine andere Wahl als SAX oder StAX zu verwenden. Räumt der Vorgesetzte genug Zeit ein, um sich in andere Technologien einzuarbeiten? Wenn nur gelesen werden soll, bietet sich jede Möglichkeit an. Was aber, wenn der Inhalt manipuliert werden muss? Dann sollte man Data-Bindings nehmen oder auf eine DOM Variante zurückgreifen. XQuery könnte es auch noch lösen, wenn die Update Facility von XQuery verwendet wird. Ist gefordert, dass viele Inhalte gleich bleiben und sich die Struktur nur verändert, sind XQuery und XSLT sicherlich gute Optionen. Wenn sich jemand nun genau an dieser Stelle befindet, sollte er die Fakten zusammentragen und die für sich geeignetste Variante abschätzen. 20