Freitag, 6. Juli 2007

XML-Dateien mittels xi:include zusammenführen

Was im Kleinen funktioniert, muss nicht zwangsläufig auch genau so im großen Rahmen funktionieren. Genau das musste ich nun auch am eigenen Leib erfahren. Keine Angst - ich lebe noch und so schlimm war es dann auch wieder nicht, aber es hat mir doch ein wenig Zeit gekostet.

Zur Sache: Ich hatte einige, immer gleich aufgebaute, XML-Dateien. Nun wollte für eine Ausgabe auf alle Daten in diesen XML-Dateien zugreifen und mittels XSL transformieren. Für die Zusammenführung verwendete ich das Tag <xi:include>. Ich erstellte also eine XML-Datei, eine XSLT-Datei und eine PHP-Datei in der ich dann die Transformation mittels der PHP-Implementierung der libxslt-Library durchführte. Alle Dateien lagen in einem Verzeichnis und alles funktioniere prima.

Test erfolgreich, also ran an die "echte" Aufgabenstellung. Ich setzte alles ganz genau so um wie in meinem zuvor erstellten Test. Doch irgendwie wollte es nicht so recht. Es sollte sich heraus, dass ich zwei Fehler gemacht hatte:

1. Pfade

Da nun alle Dateien (XML, XSLT, PHP) über verschiedene Verzeichnisse verteilt waren habe ich in meiner XML-Sammeldatei alle Pfade absolut zum DOCUMENT_ROOT angegeben. Das sollte man nicht tun! ... wie sich herausstellte.

Falsch:
<?xml version="1.0" encoding="ISO-8859-15"?>
<summary
xmlns:
xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:
xi="http://www.w3.org/2001/XInclude">
<xi:include href="/Referenzen/Bereich1/summary.xml"/>
<xi:include href="/Referenzen/Bereich1/summary.xml"/>
</summary>

Richtig:
<?xml version="1.0" encoding="ISO-8859-15"?>
<summary
xmlns:
xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:
xi="http://www.w3.org/2001/XInclude">
<xi:include href="Referenzen/Bereich1/summary.xml"/>
<xi:include href="Referenzen/Bereich1/summary.xml"/>
</summary>
Die Pfade müssen also immer relativ XML-Sammeldatei angegeben werden.

2. PHP

Warum hat mir denn keiner gesagt, dass ich dem XSLT-Processor noch sagen muss, dass der das <xi:include> aus ausführen soll? Kann der das nicht alleine? Merke: Verwendet man das <xi:include> Tag geht das bei PHP immer einher mit der Methode xinclude(). Also so:

<?php
$doc = new DOMDocument();
$xsl = new XSLTProcessor();
$doc->load($xsl_filename);
$xsl->importStyleSheet($doc);
$doc->load($xml_filename);
$doc->xinclude();
echo $xsl->transformToXML($doc);
?>

1 Kommentar:

  1. Hi Dirk,

    Danke für Deinen Tipp! Dieser Tipp macht auch noch Leute im Jahr 2010 glücklich.

    Grüße,
    Dani

    AntwortenLöschen