2009-02-24 10 views
8

मैं अपने आवेदन में देखता हूं कि मेरे पार्स किए गए एक्सएमएल फ़ाइल के अंदर xinclude मेरे जावा एक्सएसएलटी रूपांतरण के भीतर काम नहीं करता है।जावा 6 में xinclude के लिए डिफ़ॉल्ट समर्थन?

हालांकि

, हालांकि मुझे क्या करना:

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

मैं नहीं विशेष रूप से के रूप में System.getProperty("javax.xml.transform.TransformerFactory") रिटर्न "अशक्त" ट्रांसफार्मर कारखाने की स्थापना कर रहा हूँ।

मेरा प्रश्न: डिफ़ॉल्ट जावा (1.6 या 6) समर्थन xinclude करता है या क्या मुझे अपाचे Xerces जैसे वैकल्पिक XSLT पार्सर को जोड़ना है?

उत्तर

13

the spec के अनुसार, जावा 1.5 (5) के बाद से समर्थन रहा है। मेरा मानना ​​है कि XInclude समर्थन namespace awareness पर निर्भर करता है, जो पिछली संगतता कारणों के लिए डिफ़ॉल्ट रूप से बंद हो जाता है।

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

जानकारी के लिए धन्यवाद। मुझे इसे लागू करने के लिए कुछ समय चाहिए और देखें कि मैं इसे स्वीकार कर सकता हूं या नहीं। जो जानकारी आपने मुझे दी है वह वही है जो मुझे चाहिए। – Roalt

+1

धन्यवाद, बस मैं क्या देख रहा था! –

संबंधित मुद्दे