Hallo,
ich habe wieder einmal ein xslt - Problem.
Ich möchte folgende XML - Datei 'serialisieren', d.h. in eine Struktur bringen, die man dann zeilenweise weiterverarbeiten kann.
Im Ergebnis möchte ich etwas in der Art erhalten:
Ich habe dazu bereits das:
Mein Problem sind die verschachtelten arrays im Member DATA.
Abgebildet ist quasi ein Array von Arrays, die schließlich immer <values> in einer definierten Reihenfolge enthalten.
Gefühlt ist mein "Einstieg" mit <xsl:template match="data"> zu weit 'oben'.
Wie komme ich am besten an die ganz 'inneren' Arrays heran?
Die Struktur ist immer nur 2stufig - also 'ein Array in einem Array'. Trotzdem gibt es doch bestimmt eine elegante Lösung, die immer das innerste Array liefert, egal wie verschachtelt die Daten kommen.
Wenn ich das Array dann habe, wäre der <for-each> - Ansatz für die Weiterverarbeitung richtig?
Danke für Hinweise!
Tino
ich habe wieder einmal ein xslt - Problem.
Ich möchte folgende XML - Datei 'serialisieren', d.h. in eine Struktur bringen, die man dann zeilenweise weiterverarbeiten kann.
Code:
<?xml version="1.0" encoding="UTF-8"?> <methodResponse> <params> <param><value><struct> <member> <name>TIMESTAMP</name> <value>2001-01-01 10:10:10 +0200</value> </member> <member> <name>DATA</name> <value><array><data> <value><array><data> <value>D71_XX-XX_XX</value> <value>0</value> <value>33,33</value> </data></array></value> <value><array><data> <value>D21_XX-XX_XX</value> <value>0</value> <value>778888</value> </data></array></value> </data></array></value> </member> <member> <name>RESULT</name> <value>OK</value> </member> </struct></value></param> </params> </methodResponse>
Code:
TIMESTAMP;2001-01-01 10:10:10 +0200; DATA;D71_XX-XX_XX;0;33,33; DATA;D21_XX-XX_XX;0;778888; RESULT;OK;
Code:
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" indent="yes" /> <xsl:strip-space elements="*" /> <xsl:template match="/"> <xsl:apply-templates select="member" /> </xsl:template> <xsl:template match="member"> <xsl:variable name="mb" select="name" /> <xsl:choose> <xsl:when test="$mb = 'DATA'"> <xsl:apply-templates select="value" mode="data"/> </xsl:when> <xsl:when test="$mb = 'RESULT'"> <xsl:text/>RESULT;<xsl:text/> <xsl:value-of select="value" /> <xsl:text/>;
<xsl:text/> </xsl:when> <xsl:when test="$mb = 'TIMESTAMP'"> <xsl:text/>TIMESTAMP;<xsl:text/> <xsl:value-of select="value" /> <xsl:text/>;
<xsl:text/> </xsl:when> </xsl:choose> </xsl:template> <xsl:template match="data" mode="data"> <xsl:text/>DATEN;<xsl:text/> <xsl:for-each select="value"> <xsl:value-of select="." /><xsl:text/>;<xsl:text/> </xsl:for-each> <xsl:text/>;
<xsl:text/> </xsl:template> </xsl:stylesheet>
Abgebildet ist quasi ein Array von Arrays, die schließlich immer <values> in einer definierten Reihenfolge enthalten.
Gefühlt ist mein "Einstieg" mit <xsl:template match="data"> zu weit 'oben'.
Wie komme ich am besten an die ganz 'inneren' Arrays heran?
Die Struktur ist immer nur 2stufig - also 'ein Array in einem Array'. Trotzdem gibt es doch bestimmt eine elegante Lösung, die immer das innerste Array liefert, egal wie verschachtelt die Daten kommen.
Wenn ich das Array dann habe, wäre der <for-each> - Ansatz für die Weiterverarbeitung richtig?
Danke für Hinweise!
Tino
Comment