2009-02-24 32 views
8

Veo en mi aplicación que xincluir dentro de mi archivo XML analizado no funciona dentro de mi conversión Java XSLT.Soporte predeterminado para xinclude en Java 6?

Sin embargo, a pesar de que hago:

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

No estoy estableciendo específicamente la fábrica de transformadores como System.getProperty("javax.xml.transform.TransformerFactory") vuelve "nulo".

Mi pregunta: ¿el Java (1.6 o 6) predeterminado es compatible con xinclude o tengo que agregar un analizador XSLT alternativo como Apache Xerces?

Respuesta

13

Según the spec, el soporte ha estado allí desde Java 1.5 (5). Creo que la compatibilidad con XInclude se basa en namespace awareness, que está desactivado por defecto por razones de compatibilidad con versiones anteriores.

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

} 
+0

Gracias por la información. Necesitaré algo de tiempo para aplicarlo y ver si puedo aceptarlo. La información que me diste es, sin embargo, lo que necesitaba. – Roalt

+1

¡Gracias, justo lo que estaba buscando! –