Par défaut support pour xinclude en Java 6?
Question
Je vois dans mon application qui xinclude dans mon fichier XML analysé ne fonctionne pas dans mon conversion Java XSLT.
Cependant, bien que je fais:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setXIncludeAware(true);
Je ne suis pas spécifiquement mise en l'usine de transformateur retourne System.getProperty("javax.xml.transform.TransformerFactory")
« null ».
Ma question: Est-ce la valeur par défaut de Java (1.6 ou 6) le soutien xinclude ou dois-je ajouter un analyseur XSLT alternative comme Apache Xerces
La solution
Selon la spécification , le soutien a été là depuis Java 1.5 (5). Je crois que le soutien XInclude repose sur sensibilisation namespace , qui est désactivé par défaut pour des raisons de compatibilité ascendante.
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);
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow