2014-09-09 3 views
0

문제를 재현 할 수있는 최소한의 예를 만들었습니다. 이것은 변환 (mini.xsl)이다java copy-of xsl 변형은 네임 스페이스 접두사를 제거합니다.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <foo> 
      <xsl:copy-of select="."/> 
     </foo> 
    </xsl:template> 
</xsl:stylesheet> 

이 입력 (mini.xml)이다

<?xml version="1.0" encoding="utf-8"?> 
<bar xmlns:x="baz"> 
    <x:baz/> 
</bar> 

제가

xsltproc mini.xsl mini.xml 

결과에 변환을 적용 할 때 예상대로 표시 :

<?xml version="1.0"?> 
<foo> 
    <bar xmlns:x="baz"> 
    <x:baz/> 
    </bar> 
</foo> 

<?xml version="1.0" encoding="UTF-8"?> 
<foo> 
    <bar xmlns:x="baz"> 
    <baz/> 
    </bar> 
</foo> 

(통지는 X 것을 :. 바즈의 앞에 접두사가없는)

나는 다음과 같은 자바 프로그램으로 변환을 실행할 때 Wever에게는

import java.io.FileInputStream; 
import java.io.IOException; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.transform.Result; 
import javax.xml.transform.Source; 
import javax.xml.transform.Templates; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.TransformerFactoryConfigurationError; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 

public class Program 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      Source transform = new StreamSource(new FileInputStream(args[0])); 

      Templates templates = TransformerFactory.newInstance().newTemplates(transform); 

      Document input = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new FileInputStream(args[1])); 

      Result result = new StreamResult(System.out);   

      templates.newTransformer().transform(new DOMSource(input), result); 
     } 
     catch (TransformerFactoryConfigurationError | ParserConfigurationException | SAXException | IOException | TransformerException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

결과는 다음과 같다

왜 그런가요?

그리고 (네임 스페이스 접두어를 유지하기 위해) 어떻게해야합니까?

답변

1

역사적인 이유로 가정 할 수있는 것은 DocumentBuilderFactory이며 비 - 네임 스페이스 인식입니다. newDocumentBuilder()을 수행하기 전에 명시 적으로 네임 스페이스를 전환해야합니다.

또한 만드는 대신 직접 File 걸리는 parse 방법을 사용하는 것이 더 좋을 것이다 당신의 소유 Transformer 내장 된에서 StreamSource와 마찬가지로 (코드는 구문 분석이 완료되면 폐쇄되지 않음), 및 FileInputStream .

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
Document input = dbf.newDocumentBuilder().parse(new File(args[1])); 
+2

더 나은 방법은 DOM이 아닌 transform() 메서드에 StreamSource를 전달하는 것입니다. DOM과 XSLT는 실제로 잘 어울리지 않으며, 대부분의 XSLT 프로세서는 트리를 스스로 구축 할 수있게되면 훨씬 더 나은 작업을 수행 할 것입니다. –

관련 문제