2009-06-30 57 views
1

我試圖用Xalan 2.7.1在XSLT的結果中輸出CDATA節。我已將這個XSL應用於XML中的一個工具,結果包含CDATA。在下面的方法中,結果中沒有CDATA,也沒有拋出異常。我覺得我在這裏錯過了一些東西。Xalan-J的xsl cdata-section-elements輸出屬性

的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(build 2.4,J2RE 1.6.0)]時,這似乎是缺省值]。

2)我從使用StAXSource和StAXResult切換到使用StreamSource和StreamResult,它工作正常(如在skaffman's答案)。特別是從StAXResult到StreamResult的改變是有效的。在StreamResult中使用StAXSource也可以。

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-elements來實現相同的目的。當我將上述xsl應用於XML工具中的上述xml時,使用cdata-section-elements方法起作用,我得到了期望的結果。只有當我使用上面的代碼來應用xsl時,我沒有得到預期的結果 – hydeph 2009-06-30 19:03:53

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。