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();
}
}
}
결과는 다음과 같다
왜 그런가요?
그리고 (네임 스페이스 접두어를 유지하기 위해) 어떻게해야합니까?
더 나은 방법은 DOM이 아닌 transform() 메서드에 StreamSource를 전달하는 것입니다. DOM과 XSLT는 실제로 잘 어울리지 않으며, 대부분의 XSLT 프로세서는 트리를 스스로 구축 할 수있게되면 훨씬 더 나은 작업을 수행 할 것입니다. –