2009-06-30 9 views
1

J'essaie de sortir une section CDATA dans le résultat de XSLT en utilisant Xalan 2.7.1. J'ai appliqué ce XSL au XML dans un outil et le résultat contient CDATA. Dans la méthode ci-dessous, aucun CDATA n'est dans le résultat et aucune exception n'est levée. J'ai l'impression qu'il me manque quelque chose ici.xsl propriété de sortie cdata-section-elements avec 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(); 
    } 
} 
} 

sortie console

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

Répondre

0

1) Je suppose qu'il s'avère que je n'ai pas utilisé Xalan 2.7.1. Le code dans skaffman's réponse m'a fait penser à vérifier Version.getVersion() et la signature est "XL TXE Java 1.0.7". Cela semble être la valeur par défaut lors de l'utilisation d'IBM Java [IBM J9 VM (build 2.4, J2RE 1.6.0)].

2) Je suis passé d'utiliser StAXSource et StAXResult à utiliser StreamSource et StreamResult et cela fonctionne bien (comme dans skaffman's réponse). Plus précisément, le passage de StAXResult à StreamResult est ce qui a fonctionné. L'utilisation de StAXSource avec StreamResult fonctionne également.

1

Voulez-vous dire que vous voulez afficher la CDATA dans le cadre de l'élément?

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

avec

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

ou une autre forme, mais avec les personnages évadés d'omettre

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

ou peut-être que je comprends mal la question?

+0

c'est ce que je voudrais faire et votre solution fonctionne. J'ai pensé que je pourrais utiliser les éléments de la section cdata-section pour réaliser la même chose. l'utilisation de l'approche cdata-section-elements fonctionne quand j'applique le xsl ci-dessus au xml ci-dessus dans un outil XML, j'obtiens le résultat désiré. seulement quand j'utilise le code ci-dessus pour appliquer le xsl je n'obtiens pas le résultat attendu – hydeph

1

Cela fonctionne pour moi, avec Xalan 2.7.1, je ne sais pas pourquoi cela ne fonctionne pas pour vous.

I simplifié le fragment de code, mais je ne pense pas qu'il y ait une différence fonctionnelle, mais essayez quand même:

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); 
    } 
} 

sortie est:

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

Ce qui est étrange est que la version Xalan .getVersion() renvoie 2.4.1, pas 2.7.1, et je suis définitivement en utilisant 2.7.1 ici.