我想知道这一点,因此我可以将xsl转换应用于xml文档,而不会丢失某些实体,例如–
我如何告诉解析器(我不在乎的任何解析器)要使用哪个目录,然后执行xsl转换?,如何将新配置的解析器连接到转换工厂。
下面的代码表示我要在xml文件上执行的转换(工作正常)。我只想知道如何添加XML Catalog方法,以便xml文档正确加载其DTD并继续执行xsl转换步骤。
try {
SAXTransformerFactory stf = (SAXTransformerFactory) TransformerFactory.newInstance();
Templates step1Template = stf.newTemplates(new StreamSource(
this.getClass().getResourceAsStream("xsltransformation_step1.xsl")
));
Templates step2Template = stf.newTemplates(new StreamSource(
this.getClass().getResourceAsStream("xsltransformation_step2.xsl")
));
Templates step3Template = stf.newTemplates(new StreamSource(
this.getClass().getResourceAsStream("xsltransformation_step3.xsl")
));
TransformerHandler th1 = stf.newTransformerHandler(step1Template);
TransformerHandler th2 = stf.newTransformerHandler(step2Template);
TransformerHandler th3 = stf.newTransformerHandler(step3Template);
StreamSource xmlStreamSource = new StreamSource(new File(xmlInputFile));
StreamResult outputStreamSource1 = new StreamResult(new File (outputNewFile1));
StreamResult outputStreamSource2 = new StreamResult(new File (outputNewFile2));
th1.setResult(new SAXResult(th2));
th2.setResult(new SAXResult(th3));
th3.setResult(outputStreamSource1);
Transformer t = stf.newTransformer();
t.transform(xmlStreamSource, new SAXResult(th1));
}catch (TransformerException e){
e.printStackTrace();
return false;
}
这是包含实体的xmlInputFile的示例
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE manual PUBLIC '-//docufy//Docufy Standard DTD 20080125//EN' '/system/cosimago/dtd/manual.dtd'>
<chapter>
<title>LEDs „5 – 8“ am CPU-Board prüfen</title>
<body>
<!-- just content -->
</body>
</chapter>
[如果有好心人帮我解决这个问题,我将非常感激。
先谢谢您。
安德烈斯
最简单的方法是使用XMLReader
创建自己的XML解析器(SAXTransformerFactory.newInstance()
)。然后使用CatalogResolver
在解析器上设置XMLReader.setEntityResolver()
。然后将XMLReader
包裹在SAXSource
中,并将其作为Source
对象提供给Transformer.transform()
。