2009-06-30 5 views
1

Я пытаюсь вывести раздел CDATA в результате XSLT с использованием Xalan 2.7.1. Я применил этот XSL к XML в инструменте, и результат содержит CDATA. В приведенном ниже методе в результате нет CDATA, и исключение не генерируется. Я чувствую, что здесь что-то не хватает.Свойство вывода xsl cdata-section-elements с 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(); 
    } 
} 
} 

консоль вывода

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

ответ

0

1) Я думаю, что я не использовал Xalan 2.7.1. Код в skaffman's Ответ заставил меня подумать, чтобы проверить Version.getVersion(), а подпись - «XL TXE Java 1.0.7». По умолчанию это используется при использовании IBM java [IBM J9 VM (сборка 2.4, J2RE 1.6.0)].

2) Я переключился с использования StAXSource и StAXResult на использование StreamSource и StreamResult, и он отлично работает (как в ответе skaffman's). В частности, сработало изменение от StAXResult до StreamResult. Использование StAXSource с StreamResult также работает.

1

Вы говорите, вы хотите вывести CDATA как часть элемента?

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

с

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

или какой-либо другой форме, но с уцелевшими символов опустить

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

или я недоразумение вопрос может быть?

+0

Это то, что я хотел бы сделать, и ваше решение работает. Я думал, что могу использовать элементы cdata-section здесь, чтобы достичь того же. использование подхода cdata-section-elements работает, когда я применяю вышеуказанный xsl к указанному выше xml в инструменте XML, я получаю желаемый результат. только когда я использую приведенный выше код для применения xsl do i, я не получаю ожидаемый результат – hydeph

1

Это работает для меня, с Xalan 2.7.1, не уверен, почему он не работает для вас.

Я упростил фрагмент кода, но я не думаю, что есть какая-либо функциональная разница, но попробовать все равно:

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

Выход:

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

Что такое нечетное, что версия Xalan в .getVersion() возвращает 2.4.1, а не 2.7.1, и я определенно, используя 2.7.1 здесь.