Java 6 中对 xinclude 的默认支持? [英] Default support for xinclude in Java 6?

查看:23
本文介绍了Java 6 中对 xinclude 的默认支持?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中看到,我解析的 XML 文件中的 xinclude 在我的 Java XSLT 转换中不起作用.

I see in my application that xinclude inside my parsed XML file does not work within my Java XSLT conversion.

然而,虽然我这样做:

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

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

I'm not specifically setting the transformer factory as System.getProperty("javax.xml.transform.TransformerFactory") returns "null".

我的问题:默认的 Java(1.6 或 6)是否支持 xinclude 或者我是否必须添加替代的 XSLT 解析器,例如 Apache Xerces?

My question: does the default Java (1.6 or 6) support xinclude or do I have to add an alternative XSLT parser such as Apache Xerces?

推荐答案

根据 规范,从 Java 1.5 (5) 开始就提供支持.我相信 XInclude 支持依赖于 命名空间感知,出于向后兼容的原因,默认情况下该功能处于关闭状态.

According to the spec, support has been there since Java 1.5 (5). I believe XInclude support relies on namespace awareness, which is turned off by default for backwards compatibility reasons.

public class XIncludeDemo {

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

    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);
    }

}

这篇关于Java 6 中对 xinclude 的默认支持?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆