使用Java程序用XSLT转换多个XML/XHTML/HTML文件
我想获取多个输入文件(XML/HTML/XHTML)和相应的XSLT,为相应的输入文件生成输出文件。如果只有一个输入XML文件和一个输入XSLT文件,那么通过下面的程序,我能够成功地转换它。 例如,在给定程序中,我的输入(X)HTML文件是temp.HTML,输入XSLT是temp.xsl,它将输出为temp_copy.HTML。 如果我有两个或多个输入文件temp1.html和temp2.html以及相应的XSLT temp1.xsl和temp2.xsl,那么最好的方法是什么?如何使用相应的输入文件生成输出temp1_copy.html和temp2_copy.html? 谢谢你 我当前的Java代码:使用Java程序用XSLT转换多个XML/XHTML/HTML文件,java,xml,xslt,xhtml,Java,Xml,Xslt,Xhtml,我想获取多个输入文件(XML/HTML/XHTML)和相应的XSLT,为相应的输入文件生成输出文件。如果只有一个输入XML文件和一个输入XSLT文件,那么通过下面的程序,我能够成功地转换它。 例如,在给定程序中,我的输入(X)HTML文件是temp.HTML,输入XSLT是temp.xsl,它将输出为temp_copy.HTML。 如果我有两个或多个输入文件temp1.html和temp2.html以及相应的XSLT temp1.xsl和temp2.xsl,那么最好的方法是什么?如何使用相应的输
public class SimpleXSLT {
public static void main(String[] args) {
String inXML = "C:/tmp/temp.html";
String inXSL = "C:/tmp/temp.xsl";
String outTXT = "C:/tmp/temp_copy.html";
SimpleXSLT st = new SimpleXSLT();
try {
st.transform(inXML,inXSL,outTXT);
} catch(TransformerConfigurationException e) {
System.err.println("Invalid factory configuration");
System.err.println(e);
} catch(TransformerException e) {
System.err.println("Error during transformation");
System.err.println(e);
}
}
public void transform(String inXML,String inXSL,String outTXT)
throws TransformerConfigurationException,
TransformerException {
TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(inXSL);
Transformer transformer = factory.newTransformer(xslStream);
transformer.setErrorListener(new MyErrorListener());
StreamSource in = new StreamSource(inXML);
StreamResult out = new StreamResult(outTXT);
transformer.transform(in,out);
System.out.println("The generated XML file is:" + outTXT);
}
}
class MyErrorListener implements ErrorListener {
public void warning(TransformerException e)
throws TransformerException {
show("Warning",e);
throw(e);
}
public void error(TransformerException e)
throws TransformerException {
show("Error",e);
throw(e);
}
public void fatalError(TransformerException e)
throws TransformerException {
show("Fatal Error",e);
throw(e);
}
private void show(String type,TransformerException e) {
System.out.println(type + ": " + e.getMessage());
if(e.getLocationAsString() != null)
System.out.println(e.getLocationAsString());
}
}
您使用的是JAXP转换API,也称为TrAX,所以让我们继续使用它。如果您使用XSLT2.0和Saxon,那么使用Saxon的s9api会更好,但是Saxon也支持TrAX,只要您不需要高级2.0特性 在TrAX中,表示“已编译”样式表的对象是Templates对象。因此,您可以使用TransformerFactory.newTemplates()编译样式表,然后可以重复使用此Templates对象来转换多个源文档。Templates.newTransformer()提供了一个可用于执行转换的转换器。事实上,您可以重复使用转换器(串联而不是并联)来执行多个转换,但我的建议是每次使用一个新的转换器。重用模板是获得性能优势的地方;Templates对象也是线程安全的 至于1.0对2.0。对于许多简单的转换来说,1.0已经足够了,但是您很快就会发现自己在做分组或字符串操作,这在2.0中要容易得多。由于Java平台(即Saxon)有一个广泛使用的开源XSLT 2.0处理器,具有兼容的API,因此现在几乎没有理由使用XSLT 1.0
很多人错误地认为样式表上的version属性用于选择XSLT1.0或2.0处理器。通常情况并非如此(可能在某些IDE中,如XMLSpy中除外)。相反,它是为了通知处理器作者编写的XSLT规范的版本。如果您说version=“1.0”并选择一个2.0处理器,那么它将在一种“怪癖”模式下运行,这种模式试图与XSLT1.0最大限度地兼容,例如,即使在添加两个整数时,它也将使用浮点算术。相反,当您说version=“2.0”并选择1.0处理器时,处理器将在遇到不理解的语言构造时尝试采取回退操作,而不是将其作为编译时错误拒绝 这是一个严格意义上的XSLT1.0问题,还是XSLT2.0解决方案也可以接受?@DimitreNovatchev感谢您的回答。在我的XSLT文件中,声明类似于xsl:stylesheet version=“1.0”,所以我认为它应该是XSLT 1.0,但当我在一个文件中将其更改为xsl:stylesheet version=“2.0”时,它没有任何区别。我对XSLT不太了解,所以我不确定XSLT2.0是否有效,但如果可以,请提供解决方案,以便我可以尝试。谢谢你@DimitreNovatchev还说,这个java程序可以完美地处理.xml文件,但是当涉及到.html文件(XHTML)时,它会变得非常慢,有时甚至连接会超时。谢谢你的回复。现在,我正按照你的建议努力。