2009-06-30 13 views
1

Xalan 2.7.1を使用してXSLTの結果にCDATAセクションを出力しようとしています。このXSLをツールのXMLに適用し、結果にCDATAが含まれています。以下のメソッドでは、結果にCDATAはなく、例外はスローされません。私はここで何かを逃しているように感じる。xsl Xalan-Jでの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(ビルド2.4、J2RE 1.6.0)]を使用するときのデフォルトのようです。

2)私はStAXSourceとStAXResultを使用してStreamSourceとStreamResultを使用するように切り替えました。これは正常に動作します(skaffman's回答)。具体的には、StAXResultからStreamResultへの変更が有効です。 StreamResultでのStAXSourceの使用も機能します。

1

は、あなたが要素の一部として出力CDATAしたいと言っていますか?

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

またはいくつかの他のフォームと

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

が、エスケープ文字で

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

を省略するか、私はおそらく、質問を誤解していますか?

+0

これは私がやりたいことであり、あなたのソリューションは機能します。私は同じことを達成するためにここでcdata-section-elementsを使うことができると思った。上記のxslをXMLツールのxmlに適用すると、cdata-section-elementsアプローチを使用すると、結果が得られます。上記のコードを使用してxslを適用する場合のみ、私は期待した結果を得られません – 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.7.1ではなく、2.4.1を返します。私はであり、確かにで2.7.1を使用しています。

関連する問題