2016-04-04 4 views
0

Guten Morgen,Wie bekomme ich CDATA vom XML-Knoten mit xsl und konvertiere in einem neuen XML?

Ich habe ein Problem mit einem XML, das CDATA-Code enthält. Wenn wir diese XML haben:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<character> 
    <Body> 
     <methodResult> 
     <nodeOut> 
      <![CDATA[ <film>Indiana Jones and the Kingdom of the Crystal Skull</film>]]> 
     </nodeOut> 
     </methodResult> 
    </Body> 
</character> 

Wir brauchen diese haben:

<film>Indiana Jones and the Kingdom of the Crystal Skull</film> 

Wo die XSLT ist? Ich möchte nur den CDATA-Inhalt in einer XML-Datei extrahieren und den Rest löschen. Ich benutze XSLT 1.0.

Vielen Dank!

Antwort

0

Sie könnten eine Umwandlung verwenden, bei der die Ausgabemethode auf text festgelegt ist, und einfach den Textknoten aus dem Element name extrahieren.

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text" /> 

    <xsl:template match="node()|@*"> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:template> 

    <xsl:template select="name/text()"> 
     <xsl:value-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 

Beachten Sie, dass dies nicht gelingen wird, wenn es mehrere CDATA-Abschnitte in dem Elemente ist, dass Sie irgendeine Art von Wurzelelement zu schaffen brauchen würden, wenn es mehr als eine name in Ihrer Eingabe ist. Es gibt auch führende Leerzeichen in Ihrem CDATA-Bereich, daher empfehle ich Ihnen, die Ausgabe zu trimmen. Eine Möglichkeit, dies im XSLT selbst zu tun, ist die Verwendung der Funktion normalize-space(), aber dies würde auch den Inhalt des CDATA "xml" beeinflussen. Es gibt auch keinen XML-Prolog mit dieser Methode. Wenn also die Ausgabe als gültiges XML angesehen wird, hängt es davon ab, wofür Sie sie bereitstellen.

Aber das ist ein guter Anfang.

+0

Dank G_H aber ich brauche ein XML für die Ausgabemethode. Diese Lösung ist nicht gültig für mich :(Ich brauche:

1

Diese XML produzieren:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <!-- ignore this elements --> 
    <xsl:template match="role|actor|part"/> 

    <!-- get the remaining text and remove white-spaces --> 
    <xsl:template match="text()"> 
     <xsl:value-of select="normalize-space(.)" disable-output-escaping="yes"/> 
    </xsl:template> 

</xsl:stylesheet> 

Ausgang:

<?xml version="1.0" encoding="UTF-8"?><film>Indiana Jones and the Kingdom of the Crystal Skull</film> 
+0

Hallo, diese Lösung ist für XSLT 2.0? Ich brauche XSLT 1.0. Danke. –

+0

Obwohl es 2.0 in der Vorlage sagt, Es ist abwärtskompatibel, da es nur 1.0 Funktionen verwendet. – Baderous

+0

Ich habe meine Beispiel-XML editiert ... können Sie es überprüfen? Entschuldigung und vielen Dank. –

0

Eine saubere Lösung ist möglich, in XSLT 3.0 (wie von Saxon 9.7 oder Exselt unterstützt)

<xsl:template match="/"> 
    <xsl:copy-of select="parse-xml-fragment(character/name/text()[last()])"/> 
</xsl:template> 

mit Siehe https://www.w3.org/TR/xpath-functions-30/#func-parse-xml-fragment.

+0

Entschuldigung, ich habe vergessen zu kommentieren, dass ich XSLT 1.0 benutze. Vielen Dank –