Java 6 默认支持 xinclude 吗?

9

我在我的应用程序中发现,我的解析XML文件中的xinclude在Java XSLT转换中无法正常工作。

然而,尽管我这样做:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setXIncludeAware(true);

我没有专门设置转换器工厂,因为System.getProperty("javax.xml.transform.TransformerFactory")返回"null"。

我的问题是:默认的Java(1.6或6)是否支持xinclude,还是我需要添加另一种XSLT解析器,例如Apache Xerces?

1个回答

14
根据规范,Java 1.5(5)就已经支持了。我认为XInclude支持依赖于命名空间感知,出于向后兼容的原因,默认情况下已关闭该功能。
public class XIncludeDemo {

    private static final String XML = "<?xml version=\"1.0\"?>\n"
            + "<data xmlns=\"foo\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">\n"
            + "<xi:include href=\"include.txt\" parse=\"text\"/>\n"
            + "</data>\n";

    private static final String INCLUDE = "Hello, World!";

    public static void main(String[] args) throws Exception {
        // data
        final InputStream xmlStream = new ByteArrayInputStream(XML
                .getBytes("UTF-8"));
        final InputStream includeStream = new ByteArrayInputStream(INCLUDE
                .getBytes("UTF-8"));
        // document parser
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setXIncludeAware(true);
        factory.setNamespaceAware(true);
        DocumentBuilder docBuilder = factory.newDocumentBuilder();
        if (!docBuilder.isXIncludeAware()) {
            throw new IllegalStateException();
        }
        docBuilder.setEntityResolver(new EntityResolver() {
            @Override
            public InputSource resolveEntity(String publicId, String systemId)
                    throws SAXException, IOException {
                if (systemId.endsWith("include.txt")) {
                    return new InputSource(includeStream);
                }
                return null;
            }
        });
        Document doc = docBuilder.parse(xmlStream);
        // print result
        Source source = new DOMSource(doc);
        Result result = new StreamResult(System.out);
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(source, result);
    }

}

谢谢你提供的信息。我需要一些时间来应用它并看看是否能够接受。不过,你给我的信息正是我所需要的。 - Roalt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接