XInclude in Saxon
- Details
- Erstellt am Montag, 20. September 2010 08:21
- Geschrieben von Thorsten Trippel
Viele Transformationen von XML Dokumenten werden mittels Saxon durchgeführt, eines XQuery und XSLT verarbeitenden Programms. Sprachressourcen werden aber häufig nicht nur in einer, sondern in mehreren Dateien abgelegt oder beschrieben, die von einer zentralen Datei mittels XInclude eingebunden werden. Auch diese Sammlung von Dateien kann man auf einmal transformieren. Man muss nur dafür sorgen, dass die XIncludes, also die Einbindungen, ausgeführt werden, bevor man transformiert.
Um diesen Absatz zu verstehen...
Für denjenigen, der den vorherigen Absatz nicht verstanden hat, soll hier eine kurze, möglichst nicht technische Erläuterung versucht werden, die technischen Grundlagen sind dann anderswo zu finden. XML ist ein Syntaxformalismus für verschiedene Dokumentarten. So werden Sprachressourcen heutzutage normalerweise in Dateien abgelegt, die gemäß diesem Syntaxformalismus erstellt wurden und die die Dokumentstrukturen explizit enthalten. Salopp könnte man sagen, dass diese Dokumente ganz viele spitze Klammern enthalten und die Struktur wiedergeben. Formal werden in XML-Dokumenten Bäume beschrieben. Um diese Bäume in anderen Programmen zu verwenden oder anzuzeigen, müssen die häufig verändert werden, Teilbäume werden ausgewählt, die Bäume werden umgestellt, ergänzt, etc. Dies geschieht entweder durch Abfragen (mit XQuery) oder durch Transformationen (in XSLT).
Um eine höhere Übersichtlichkeit zu gewährleisten - und manchmal auch aus Gründen der Effizienz, von Urheberrechten, von Arbeitsabläufen - liegen häufig XML-Dateien vor, die zusammen gehören und zusammen weiterverarbeitet werden sollten, die aber nicht einfach in eine gemeinsame Datei kopiert werden können oder sollen. Um sie zusammen zu fassen, verwendet man XInclude, eine Technik, bei der man in einer XML-Datei angibt, dass eine andere XML-Datei eingebunden werden soll. Idealerweise "sieht" ein Programm, das auf der einbindenden Datei operiert, statt der Anweisung zur Einbindung, sofort die eingebundene Information. Für die technischen Details sei auf Dokumentationsmaterial und Online-Kurse/-Tutorials zu XML, XSLT und XInclude verwiesen.
Wie macht man das nun?
Zur Einbindung von einer XML Datei in eine andere benötigt man in der einbindenden Datei eine Namespace-Deklaration - etwa xmlns:xi="http://www.w3.org/2001/XInclude" - und einen oder mehrere XInclude-Statements, z.B. <xi:include href="/nalida/DATEINAME.xml"/>, wobei DATEINAME.xml der Name, gegebenenfalls mit Pfad, zur einzubindenden Datei ist. Eigentlich wäre man damit fertig, wenn man nicht noch dafür sorgen müsste, dass ein Programm das auch interpretiert. </p> <p>Bei der Transformation von XML-Dateien mit Saxon wird normalerweise nur die aktuelle XML-Datei gelesen. Weil XInclude-Statements aber selbst XML-Elemente sind, könnte sie Saxon zwar transformieren, aber würde sie eigentlich nicht interpretieren. Um die XInclude-Statements zu interpretieren, muss man Saxon die Anweisung dazu geben. Dies geschieht beim Aufruf von Saxon mittels der Option -xi.</p> <p>Saxon mit XInclude würde dann etwa mit <pre>java -jar saxon.jar -s:Eingabedatei.xml -xsl:Transformationsdatei.xsl -xi </pre> aufgerufen, wobei die Pfade zu Saxon, der Eingabe- und Transformations-Datei anzupassen sind. Bei der Transformation mit Saxon aus dem XML-Editor <a href="http://www.oxygenxml.com" title="Oxygen XML-Editor" target="_blank">Oxygen heraus werden XIncludes direkt interpretiert. Daher kann es beim Übergang von Entwicklungen aus dem Editor in automatisierte Skripte zu interessanten "Nebenwirkungen" kommen, wenn man nicht daran denkt, den Parameter -xi mit anzugeben.