[TYPO3-german] wie xml konvertieren?

Torsten Schrade schradt at uni-mainz.de
Tue Jul 15 22:54:14 CEST 2014


Hi Bernd,

> Nun soll es eine Änderung in der XML-Struktur (Feld: pi_flexform) 
> geben. damit nicht Tausende von Datensätzen neu eingegeben werden 
> müssen soll es eine Konvertierung geben (bei der evtl. auch mal das XML 
> aufgeräumt werden könnte [1]).

Ich würde Dir in jedem Fall auch eine XSL Transformation empfehlen, das 
ist die richtige Technologie dafür. Hier ist mal ein Beispiel XSLT, mit 
dem sich Dein Ausgangs-XML in Dein Ziel-XML transformieren lässt:

https://gist.github.com/tesselation/7fd37e64c983bc67cdfc

Du kannst es hier testen:

http://www.freeformatter.com/xsl-transformer.html

Zum Ansatz: Vom Wurzelknoten aus wird über die Kindknoten des 
Ausgangs-XMLs iteriert. Dabei würde ich mit "call-template" und nicht 
mit "match" arbeiten, da man so eine bessere Kontrolle über die 
Struktur des Ziel-XMLs hat. Für jedes neue Sheet, das Du generieren 
möchtest, rufst Du ein entsprechendes <xsl:template> auf. In diesen 
Sheet-Templates selektierst Du Dir dann mit XPATH Ausdrücken die Knoten 
aus Deinem Ausgangs-XML, die dann mittes copy-of einschließlich ihrer 
Kindknoten an die richtige Stelle im Ziel-XML kopiert werden.

Wie immer bei XSL Transformationen hängt alles stark von der Struktur 
des Ausgangs-XMLs ab. Wenn sich die Strukturen Deiner Flexform-Felder 
stark unterscheiden, musst du u.U. noch ein paar 
Ausnahmeregeln/-templates einbauen, um solche Fälle dann während der 
Transformation abzufangen (bspw. mit xsl:if etc.).

Insgesamt wäre mein Ansatz ein eID Skript, dass zunächst die DB 
konnektiert und dann alle pi_flexforms holt. Dann würde ich über die 
Ergebniszeilen iterieren, die Flexform-Strings mittels SimpleXML laden 
und dieses Objekt dann in ein DOMDocument importieren. Mit dem 
DOMDocument lässt sich dann eine XSL Transformation durchführen und das 
Resultat als XML String zurückgeben. Und dann ab damit zurück in die DB.

Das hier könnte hilfreich für das Verfahren sein:

https://forge.typo3.org/projects/extension-cobj_xslt/repository/entry/trunk/class.tx_cobj_xslt.php 


Noch ein Hinweis: In PHP gibt es leider nur XSLT 1.0, darauf muss man 
achten, wenn man nach Lösungsvorschlägen im Web sucht. Dafür kriegst Du 
über die Registrierung des PHP Namespaces im Kopf Deines XSLT 
Stylesheets Zugriff auf PHP Funktionen, die dann auch im Stylesheet 
verwendet werden können. Das ist ziemlich praktisch, wenn man auch 
Regex o.ä. bei einer Transformation braucht. Mehr dazu hier: 
http://php.net/manual/de/xsltprocessor.registerphpfunctions.php

Viel Erfolg!
Torsten




More information about the TYPO3-german mailing list