2009-02-24 3 views
8

내 응용 프로그램에서 구문 분석 된 XML 파일 내의 xinclude가 Java XSLT 변환에서 작동하지 않습니다. 내가 특별히 System.getProperty("javax.xml.transform.TransformerFactory") 반환 "널 (null)"로 변압기 공장을 설정하고 있지 않다Java 6에서 xinclude에 대한 기본 지원은 무엇입니까?

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

: 내가 비록 그러나

.

내 질문 : 기본 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

고마워, 내가 뭘 찾고 있었는지! –

관련 문제