Ich musste neulich eine sehr große XML Datei splitten und die Daten in mehrere Ausgabedateien verteilen. Nach längeren versuchen, musste ich feststellen, dass XLST die schnellste Variante war um die gesamte Datei in einer akzeptablen Zeit zu verarbeiten.
Dabei bin ich darauf gestossen, dass man über Parameter den Inhalt von Variablen, die ich im PHP Code verwende, an das XSL Stylesheet übergeben kann. Das hat den Charm, dass ich nur ein Stylesheet bauen musste, um z.B. für mehrere Daten jeweils eine Ausgabe zu erstellen.Die Übergabe des Parameters vom PHP Code in das XSL war recht schnell zu realisieren. Ein bisschen suchen musste ich aber nach der Möglichkeit, diesen Parameter wiederum innerhalb der Xpath Query im XSL Stylesheet verwenden zu können.
Das XML mit den ganzen Daten sieht (in gekürzter Form) so aus:
Das Ausgabe XML sollte nach der XSL Transformation dann so aussehen:
Diese Struktur soll für alle drei Elemente (PROD, TEL und CITY) jeweils getrennt in eine eigene Datei abgelegt werden.
Die Lösung habe ich einfach so gebaut, dass im XSL Stylesheet einfach eine Variable (var) definiert ist und der Inhalt der Variable in der Xpath Query, durch [name()=$var], verwenden kann:
Diese Variable im XSL wird dann über den XSLT-Processor von PHP mit einem Parameter versorgt:
$xslDoc = new DOMDocument(); $xslDoc->load('collection.xsl'); $xmlDoc = new DOMDocument(); $xmlDoc->load('test\test.xml'); $proc = new XSLTProcessor(); $proc->importStylesheet($xslDoc); $proc->setParameter('', 'var', 'CITY'); echo $proc->transformToXML($xmlDoc);
So konnte ich ein einfach bei jedem Aufruf des XSLT-Processors die Variable (var) einfach mit einem neuen Wert versorgen und erhielt die Ausgabestruktur wie gewünscht.