Suporte padrão para xinclude em Java 6?
Pergunta
Eu vejo no meu aplicativo que xinclude dentro do meu arquivo XML analisado não funciona dentro do meu conversão Java XSLT.
No entanto, embora eu faço:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setXIncludeAware(true);
Eu não estou definindo especificamente a fábrica de transformadores como System.getProperty("javax.xml.transform.TransformerFactory")
retorna "null".
A minha pergunta:? Faz o padrão Java (1.6 ou 6) apoio xinclude ou eu tenho para adicionar um analisador XSLT alternativa, como Apache Xerces
Solução
De acordo com a a especificação , o apoio foi lá desde Java 1.5 (5). Eu acredito que o apoio XInclude depende consciência namespace, que está desativada por padrão por razões de compatibilidade para trás.
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);
}
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow