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