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


_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an