2016-04-28 12 views
0

Ich muss meine Eingabe XML mit XSLT transformieren. Es enthält, CDATA und ich muss Elemente aus CDATA extrahieren und dann muss ich das Tag umbenennen.XSLT Transformation und CDATA

Unten ist mein Eingang xml:

<getArtifactContentResponse> 
     <return> 
      <![CDATA[ 
     <metadata> 
     <overview>   
      <name>scannapp</name> 
      <developerId>developer702</developerId> 
      <stateId>2</stateId> 
      <serverURL>dddd</serverURL> 
      <id>cspapp1103</id> 
      <description>scann doc</description> 
      <hostingTypeId>1</hostingTypeId> 
    </overview> 
    </metadata> 
     ]]> 
     </return> 
    </getArtifactContentResponse> 

Und die erwartete Ausgabe ist:

<?xml version="1.0" encoding="UTF-8"?> 
    <metadata > 
    <information>   
     <name>scannapp</name> 
     <developerId>developer702</developerId> 
     <stateId>2</stateId> 
     <serverURL>ddddd</serverURL> 
     <id>cspapp1103</id> 
     <description>scann doc</description> 
     <hostingTypeId>1</hostingTypeId>   
    </Information> 
</metadata> 

XSLT Ich benutze ist unten:

<xsl:output method="xml" version="1.0" encoding="UTF-8" /> 
<xsl:template match="/"> 
    <xsl:value-of select="//ns:getArtifactContentResponse/ns:return/text()" disable-output-escaping="yes"/> 
</xsl:template> 


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

Mit diesem Ich bin in der Lage das auszuüben CDATA, aber das Element "Übersicht" wird nicht in "Information" umbenannt.

Transformed xml ist unter:

<?xml version="1.0" encoding="UTF-8"?> 

    <metadata> 
    <overview>   
     <name>scannapp</name> 
     <developerId>developer702</developerId> 
     <stateId>2</stateId> 
     <serverURL>dddddd</serverURL> 
     <id>cspapp1103</id> 
     <description>scann doc</description> 
     <hostingTypeId>1</hostingTypeId>   
    </overview> 
</metadata> 

Kann mir jemand sagen, wie ich den Tag nach der Extraktion des CDATA umbenennen? Ich verstehe nicht, was ich hier vermisse?

Vielen Dank im Voraus

+2

Wenn nur XSLT Version 1.0 verfügbar ist, müssen Sie ein weiteres XSLT auf der Ausgabe Ihrer ursprünglichen XSLT ausführen, um die gewünschte Ausgabe zu erzeugen. Der Inhalt von CData wird als reiner Text betrachtet, so dass er nicht wie ein normales XML-Fragment von XSLT verarbeitet werden kann. – har07

+1

Related: 1. [Konvertieren Sie ein XML-Element, dessen Inhalt in CDATA ist] (http://stackoverflow.com/questions/2067116/convert-an-xml-element-whose-content-isinside-cdata), 2. [XML aus CDATA mit XSL transformieren] (http://stackoverflow.com/questions/18612639/transform-xml-from-cdata-using-xsl) – har07

+0

Nicht klar für mich. Können Sie das bitte anhand des obigen Beispiels erklären? – krishh

Antwort

0

keine Elemente in Ihrem CDATA Es gibt, gibt es nur Text. Das ist, was CDATA bedeutet: "Dieses Zeug könnte wie Markup aussehen, aber ich möchte es als Text behandeln".

Das Umwandeln von Text in Elemente wird Parsing genannt. Um also die Elemente aus dem Text in Ihrem CDATA zu extrahieren, müssen Sie es analysieren. Es gibt keine direkte Möglichkeit, dies in XSLT zu tun, bis Sie zu XSLT 3.0 gelangen (das eine parse-xml() Funktion hat). Einige XSLT-Prozessoren haben dafür eine Erweiterungsfunktion; In einigen (glaube ich) die Funktion exslt: node-set() tut dies, wenn Sie eine Zeichenfolge als Eingabe angeben. Mit anderen können Sie Ihren eigenen Java- oder Javascript-Code aufrufen, um das Parsing durchzuführen. So wird alles prozessorabhängig.

Ein anderer Ansatz besteht darin, den XML-Code in Ihrem CDATA-Abschnitt mit dem Trick "disable-output-escape" auszugeben und ihn dann in einer zweiten Umwandlung zu verarbeiten.

Der beste Weg ist, die CDATA-Tags loszuwerden, bevor Sie beginnen. Sie hätten niemals dort hingestellt werden sollen.

Verwandte Themen