2009-06-30 15 views
1

Ich versuche, einen CDATA-Abschnitt im Ergebnis von XSLT mit Xalan 2.7.1 auszugeben. Ich habe dieses XSL in einem Tool auf das XML angewendet und das Ergebnis enthält CDATA. In der folgenden Methode ist keine CDATA im Ergebnis und es wird keine Ausnahme ausgelöst. Ich fühle mich, als würde ich hier etwas vermissen.xsl cdata-section-elements Ausgabe-Eigenschaft mit Xalan-J

test.xml

<?xml version="1.0" encoding="UTF-8"?> 
<parentelem> 
    <childelem>Test text</childelem> 
</parentelem> 

Test.xsl

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" encoding="UTF-8" cdata-section-elements="newchildelem" /> 
<xsl:template match="/"> 
<parentelem> 
    <newchildelem><xsl:value-of select="/parentelem/childelem" /></newchildelem> 
</parentelem> 
</xsl:template> 
</xsl:stylesheet> 

Transform.java

import java.io.FileReader; 
import java.io.StringWriter; 

import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLOutputFactory; 
import javax.xml.stream.XMLStreamReader; 
import javax.xml.stream.XMLStreamWriter; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stax.StAXResult; 
import javax.xml.transform.stax.StAXSource; 

public class Transform { 

    public static void main (String[] args){ 
    try { 
     XMLStreamReader xmlReader = XMLInputFactory.newInstance().createXMLStreamReader(
      new FileReader("test.xml")); 

     XMLStreamReader xslReader = XMLInputFactory.newInstance().createXMLStreamReader(
       new FileReader("test.xsl")); 

     TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
     Source xslSource = new StAXSource(xslReader); 
     Source xmlSource = new StAXSource(xmlReader); 
     Transformer transf = transformerFactory.newTransformer(xslSource); 

     StringWriter xmlString = new StringWriter(); 
     XMLStreamWriter xmlWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(
       xmlString); 

     Result transformedXml = new StAXResult(xmlWriter); 
     transf.transform(xmlSource, transformedXml); 

     xmlWriter.flush(); 
     System.out.println(xmlString.toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
} 

Konsolenausgabe

<?xml version="1.0" encoding="UTF-8"?><parentelem><newchildelem>Test text</newchildelem></parentelem> 

Antwort

0

1) Ich denke, es stellt sich heraus, dass ich Xalan 2.7.1 nicht verwendet habe. Der Code in skaffman's Antwort ließ mich denken, Version.getVersion() zu überprüfen und die Signatur ist "XL TXE Java 1.0.7". Dies scheint der Standard zu sein, wenn IBM Java [IBM J9 VM (Build 2.4, J2RE 1.6.0)] verwendet wird.

2) Ich wechselte von der Verwendung von StAXSource und StAXResult zu StreamSource und StreamResult und es funktioniert gut (wie in skaffman's Antwort). Insbesondere der Wechsel von StAXResult zu StreamResult hat funktioniert. Die Verwendung von StAXSource mit StreamResult funktioniert auch.

1

Behaupten Sie, die Sie ausgeben wollen, dass die CDATA als Teil des Elements?

<newchildelem><xsl:value-of select="/parentelem/childelem" /></newchildelem> 

mit

<newchildelem><xsl:text>&lt;![CDATA[ 
</xsl:text><xsl:value-of select="/parentelem/childelem" /><xsl:text>]]&gt</xsl:text></newchildelem> 

oder einer anderen Form, aber mit dem Escape-Zeichen wegzuzulassen

<newchildelem><![CDATA[Test text]]></newchildelem> 

oder bin ich Missverständnis, die vielleicht Frage?

+0

das ist was ich gerne tun würde und Ihre Lösung funktioniert. Ich dachte, dass ich hier die cdata-Sektion-Elemente benutzen könnte, um das gleiche zu erreichen. Der cdata-section-elements-Ansatz funktioniert, wenn ich das obige xsl auf das obige XML in einem XML-Tool anwende, bekomme ich das gewünschte Ergebnis. nur wenn ich den obigen Code verwende, um die xsl anzuwenden, bekomme ich nicht das erwartete Ergebnis – hydeph

1

Es funktioniert für mich, mit Xalan 2.7.1, nicht sicher, warum es für Sie nicht funktioniert.

ich das Codefragment vereinfachte, aber ich glaube nicht, dass jeder funktioneller Unterschied, aber es trotzdem versuchen:

import javax.xml.transform.Source; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

import org.apache.xalan.Version; 

public class Transform { 

    public static void main(String[] args) throws Exception { 
     System.out.println(Version.getVersion()); 
     Source xslSource = new StreamSource(Transform.class.getResourceAsStream("test.xsl")); 
     Source xmlSource = new StreamSource(Transform.class.getResourceAsStream("test.xml")); 

     Transformer transf = TransformerFactory.newInstance().newTransformer(xslSource); 

     StreamResult transformedXml = new StreamResult(System.out); 
     transf.transform(xmlSource, transformedXml); 
    } 
} 

Ausgang ist:

Xalan Java 2.4.1 
<?xml version="1.0" encoding="UTF-8"?> 
<parentelem><newchildelem><![CDATA[Test text]]></newchildelem></parentelem> 

Was seltsam ist, dass Xalan der Version .getVersion() liefert 2.4.1, nicht 2.7.1, und ich bin definitiv mit 2.7.1 hier.