XML Elemente in CDATA verpacken

Loki2

Erfahrenes Mitglied
Hallo

Wie kann ich mit einer Transformation die Werte aller Elemente in CDATA verpacken?

Also aus

Code:
<mynode>blablabla</mynode
soll

Code:
<mynode><![CDATA[blablabla]]></mynode
werden und das für jedes Element in meinem XML.

Habt ihr eine Idee wie man das bewerkstelligen könnte? Später brauch ich dann auch noch den Rückweg, also aus allen Elementen das CDATA entfernen.

Ich hoffe ihr könnt mir weiterhelfen.

Viele Grüße,
Loki2
 
Hi.

Du müßtest alle diese Elemente in dem cdata-section-elements Attribut des xsl:eek:utput Elements angeben:
XML:
<xsl:output cdata-section-elements="mynode node1 node2 node3"/>
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hi,

danke für die Antwort.

Wenn es doch nur so einfach wäre, das klappt leider nicht :-(
Das wird trotzdem nicht in CDATA verpackt.

Loki2
 
Hallo

Hier mal ein kleines Beispiel:

Incoming XML:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <data>
        <PUI>123456</PUI>
        <IT>BLA</IT>
        <Sonstiges>
            <details>
                <detail1>789</detail1>
                <detail2>BLUB</detail2>
                <detail3>BalBlub</detail3>
            </details>
        </Sonstiges>
    </data>
</root>
Transformation Versuch 1:

Code:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output cdata-section-elements="PUI IT detail1 detail2 detail3"/>

    <xsl:template match="/">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>
Transformation Versuch 2:

Code:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output cdata-section-elements="PUI IT detail1 detail2 detail3"/>

    <xsl:template match="/">
        <xsl:for-each select="node()">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
Ergebnis bei beiden:

Code:
<?xml version='1.0' ?>
<root>
    <data>
        <PUI>123456</PUI>
        <IT>BLA</IT>
        <Sonstiges>
            <details>
                <detail1>789</detail1>
                <detail2>BLUB</detail2>
                <detail3>BalBlub</detail3>
            </details>
        </Sonstiges>
    </data>
</root>
Das funktioniert also mal so gar nicht :-(
Das was ich gerne haben möchte ist folgendes:

Code:
<?xml version='1.0' ?>
<root>
    <data>
        <PUI><![CDATA[123456]]></PUI>
        <IT><![CDATA[BLA]]></IT>
        <Sonstiges>
            <details>
                <detail1><![CDATA[789]]></detail1>
                <detail2><![CDATA[BLUB]]></detail2>
                <detail3><![CDATA[BalBlub]]></detail3>
            </details>
        </Sonstiges>
    </data>
</root>
Was muss ich tun um das Ergebnis zu bekommen? Ich hoffe ihr könnt mir weiterhelfen.

Viele Grüße,
Christian
 
Hi.

Dein Stylesheet ist falsch. Du verarbeitest in beiden Stylesheets nur das <root> Element, sonst nichts - und das ist kein CDATA Element. Also ist die Ausgabe völlig korrekt.
XML:
<xsl:template match="node()">
  <xsl:copy-of "."/>
</xsl:template>
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Danke für die Antwort.

Das Stylesheet von Dir funktioniert aber auch nicht. Der Output sieht nach wie vor so aus wie der Input.
 
Danke für die Antwort.

Das Stylesheet von Dir funktioniert aber auch nicht. Der Output sieht nach wie vor so aus wie der Input.
Dann hast du was falsch gemacht. Ich bekomme folgende Ausgabe:
XML:
<?xml version="1.0"?>
<root>
    <data>
        <PUI><![CDATA[123456]]></PUI>
        <IT><![CDATA[BLA]]></IT>
        <Sonstiges>
            <details>
                <detail1><![CDATA[789]]></detail1>
                <detail2><![CDATA[BLUB]]></detail2>
                <detail3><![CDATA[BalBlub]]></detail3>
            </details>
        </Sonstiges>
    </data>
</root>
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Merkwürdig.

Hier nochmal mein komplettes Stylesheet:
Code:
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output cdata-section-elements="PUI IT detail1 detail2 detail3"/>

	<xsl:template match="node()">
		<xsl:copy-of select="."/>
	</xsl:template>
</xsl:stylesheet>

Danke für die Hilfe.

Loki2
 
Hi.

Bist du dir sicher, das auch dieses Stylesheet bei der Transformation verwendet wird? Ich hab es jetzt mit xsltproc und Saxon9 ausprobiert, bei beiden Transformationen erhalte ich die gewünschte Ausgabe.

Gruß

PS: Welchen XSLT Prozessor verwendest du denn?
 
Zurück