2009-02-24 14 views
8

Uygulamamda, ayrıştırılmış XML dosyamın içinde xinclude'ın benim Java XSLT dönüşümünde çalışmadığını görüyorum. Ben özellikle System.getProperty("javax.xml.transform.TransformerFactory") döner "boş" olarak trafo fabrikası ayarı değilimJava 6 xinclude için varsayılan destek?

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

: Ben her ne kadar Ancak

.

Soruma: varsayılan Java (1.6 veya 6) desteği xinclude mi yoksa Apache Xerces gibi alternatif bir XSLT ayrıştırıcısı mı eklemek zorundayım?

cevap

13

the spec'a göre, Java 1.5'ten beri destek olmuştur (5). XInclude desteğinin, geriye dönük uyumluluk nedenleriyle varsayılan olarak devre dışı bırakılan namespace awareness belgesine bağlı olduğuna inanıyorum.

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

Bilgi için teşekkür ederiz. Bunu uygulamak ve kabul edip edemeyeceğimi görmek için biraz zamana ihtiyacım var. Ancak bana verdiğiniz bilgiler, ihtiyacım olan şey. – Roalt

+1

Teşekkürler, sadece aradığım şey! –

İlgili konular