2009-02-24 12 views
8

Vedo nella mia applicazione che xinclude all'interno del mio file XML analizzato non funziona all'interno della mia conversione Java XSLT.Supporto predefinito per xinclude in Java 6?

Tuttavia, anche se lo faccio:

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

Non sto specificamente l'impostazione della fabbrica di trasformatori come System.getProperty("javax.xml.transform.TransformerFactory") restituisce "null".

La mia domanda: il Java predefinito (1.6 o 6) supporta xinclude o devo aggiungere un parser XSLT alternativo come Apache Xerces?

risposta

13

Secondo the spec, il supporto è presente da Java 1.5 (5). Credo che il supporto XInclude si basi su namespace awareness, che è disattivato per impostazione predefinita per motivi di compatibilità con le versioni precedenti.

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

Grazie per l'informazione. Avrò bisogno di tempo per applicarlo e vedere se posso accettarlo. Le informazioni che mi hai dato sono comunque ciò di cui avevo bisogno. – Roalt

+1

Grazie, proprio quello che stavo cercando! –