我想获取多个输入文件(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代码:
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());
}
}
答案 0 :(得分:2)
您正在使用JAXP转换API,也称为TrAX,所以让我们坚持下去。如果您转移到XSLT 2.0和Saxon,那么使用Saxon的s9api API会更好,但只要您不需要高级2.0功能,Saxon也支持TrAX。
在TrAX中,表示“已编译”样式表的对象是Templates对象。因此,您使用TransformerFactory.newTemplates()来编译样式表,然后您可以重复使用此Templates对象来转换多个源文档。 Templates.newTransformer()为您提供了一个可用于执行转换的转换器。实际上你可以重复使用变压器(串联但不是并联)来执行多次变换,但我的建议是每次都使用一个新的变换器。重用模板是您获得性能优势的地方; Templates对象也是线程安全的。
1.0对2.0。对于许多简单的转换1.0是相当充分的,但你很快就会发现自己做的事情就是在2.0中更容易实现的分组或字符串操作。由于有一个广泛使用的开源XSLT 2.0处理器可用于Java平台(即Saxon),并且使用兼容的API,因此最近几乎没有理由使用XSLT 1.0。
很多人错误地认为样式表上的version属性以某种方式用于选择XSLT 1.0或2.0处理器。通常情况并非如此(除了某些IDE,例如XML Spy)。相反,它是通知处理器作者写入的XSLT规范的版本。如果你说版本=“1.0”并选择一个2.0处理器,那么它将以一种“quirks”模式运行,该模式试图与XSLT 1.0最大程度地兼容,例如,即使你要添加两个,它也会使用浮点运算整数。相反,当您说版本=“2.0”并选择1.0处理器时,处理器将在遇到它不理解的语言结构时尝试采取回退操作,而不是将这些作为编译时错误拒绝。