使用Java程序用XSLT转换多个XML/XHTML/HTML文件

使用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,那么最好的方法是什么?如何使用相应的输

我想获取多个输入文件(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());
    }
}

您使用的是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)时,它会变得非常慢,有时甚至连接会超时。谢谢你的回复。现在,我正按照你的建议努力。