Java 6中对xinclude的默认支持? [英] Default support for xinclude in Java 6?
问题描述
我在我的应用程序中看到,在我的解析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\"?>\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);
}
}
这篇关于Java 6中对xinclude的默认支持?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!