我在我的应用程序中看到,我解析的 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="www.w3/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 的默认支持?
发布评论