1

Xalan 2.7.1 を使用して XSLT の結果に CDATA セクションを出力しようとしています。この XSL をツールで XML に適用したところ、結果に CDATA が含まれています。以下のメソッドでは、結果に CDATA はなく、例外はスローされません。ここで何かが足りない気がします。

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>
4

3 に答える 3

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 の Version.getVersion() が 2.7.1 ではなく 2.4.1 を返すことです。ここでは間違いなく2.7.1 を使用しています。

于 2009-06-30T19:08:57.797 に答える
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>

または、おそらく質問を誤解していますか?

于 2009-06-30T18:54:36.330 に答える
0

1) Xalan 2.7.1 を使用していないことが判明したと思います。skaffman's answerのコードは、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 の回答のように)。具体的には、StAXResult から StreamResult への変更が機能しました。StreamResult で StAXSource を使用することも機能します。

于 2009-07-19T22:36:49.653 に答える