0

看起来 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 在使用命名空间时没有正确处理 CDATA。

考虑以下示例:

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class CdataTest {
  public final String tmpDir = "/tmp";
  public final String nameSpace = "http://sample.namespace.com";
  public final String cdataFields = String.format("{%s}title {%s}description", nameSpace, nameSpace);

  public static void main(String[] args) {
    CdataTest test = new CdataTest();
    String fileName = String.format("%s/%s.xml", test.tmpDir, "Feed");
    String fileNameFormatted = String.format("%s/%sFormatted.xml", test.tmpDir, "Feed");
    try {
      test.transform(fileName, fileNameFormatted, test.cdataFields);
    } catch (TransformerException e) {
      e.printStackTrace();
    }
  }

  private void transform(String source, String destination, String cdataFields) throws TransformerException {
    System.out.println(cdataFields);
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
    transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, cdataFields);
    transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.transform(new StreamSource(source), new StreamResult(destination));
  }
}

使用以下 XML

<?xml version="1.0" encoding="UTF-8"?>
<entries xmlns="http://sample.namespace.com">
  <entry id="1">
    <title>sample title 1</title>
    <description>sample description 1</description>
  </entry>
  <entry id="2">
    <title>sample title 2</title>
    <description>sample description 2</description>
  </entry>
</entries>

通过显式指定 TransformerFactory 实现来运行它

java -Djaxp.debug=1 -Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl CdataTest

不能正确处理 CDATA 字段。但是,如果从转换代码和 XML 中删除命名空间,则文档将正确转换。

需要注意的是,以上使用 org.apache.xalan.processor.TransformerFactoryImpl 可以正常工作,但这不是一个选项......

如何使用 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 正确处理具有命名空间的 CDATA 字段?

4

0 回答 0