2009-02-24 9 views
8

私のアプリケーションでは、解析されたXMLファイル内のxincludeは、Java XSLT変換では機能しません。しかしJava 6のxincludeのデフォルトサポートはありますか?

、私が行うものの:

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

私は、具体的System.getProperty("javax.xml.transform.TransformerFactory")戻っ「ヌル」として変圧器工場を設定していませんよ。

私の質問:デフォルトのJava(1.6または6)のサポートはxincludeですか、あるいはApache Xercesのような別のXSLTパーサーを追加する必要がありますか?

答えて

13

the specによれば、Java 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

ありがとう、ちょうど私が探していたもの! –

関連する問題