0

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

1 回答 1

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。

许多人错误地认为样式表上的版本属性以某种方式用于选择 XSLT 1.0 或 2.0 处理器。通常情况并非如此(可能在某些 IDE 中,例如 XML Spy 除外)。相反,它用于通知处理器作者正在编写的 XSLT 规范的版本。如果您说 version="1.0" 并选择 2.0 处理器,那么它将以一种尝试最大程度地与 XSLT 1.0 兼容的“怪癖”模式运行,例如,即使您添加两个,它也会使用浮点运算整数。相反,当您说 version="2.0" 并选择 1.0 处理器时,处理器将在遇到它不理解的语言结构时尝试采取回退操作,而不是将这些作为编译时错误拒绝。

于 2012-08-01T08:48:02.510 回答