2009-02-24 11 views
8

Ich sehe in meiner Anwendung, dass xinclude innerhalb meiner geparsten XML-Datei nicht funktioniert innerhalb meiner Java XSLT-Konvertierung.Standardunterstützung für xinclude in Java 6?

Doch obwohl ich:

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

Ich bin gerade nicht den Transformator Fabrik als System.getProperty("javax.xml.transform.TransformerFactory") returns "null" zu setzen.

Meine Frage: Unterstützt der Standard-Java (1.6 oder 6) xinclude oder muss ich einen alternativen XSLT-Parser wie Apache Xerces hinzufügen?

Antwort

13

Laut the spec ist seit Java 1.5 (5) Support. Ich glaube, die XInclude-Unterstützung beruht auf namespace awareness, die aus Gründen der Abwärtskompatibilität standardmäßig deaktiviert ist.

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

Vielen Dank für die Informationen. Ich werde etwas Zeit brauchen, um es anzuwenden und zu sehen, ob ich es akzeptieren kann. Die Information, die du mir gegeben hast, ist jedoch, was ich brauchte. – Roalt

+1

Danke, genau wonach ich gesucht habe! –