根据 XSLT 版本选择 XSLT 处理器

Choose XSLT processor depending on XSLT version

我的应用程序有许多用 XSLT 1.0 编写的旧样式表,新的正在用 XSLT 2.0 编写。

使用 Saxon 9.6 许多旧样式表无法正常工作,尤其是使用 EXSLT set:distinct 的样式表。因此,我想继续使用 Xalan 来转换旧的 XSLT 1.0 样式表,但使用 Saxon 来转换新的 XSLT 2.0 样式表。

在 Java 中,在决定 TransformerFactory 之前读取 XSL 文件的 xsl:stylesheet/@version 属性的最佳方法是什么?

截至目前,应用程序从 XSL 文件的绝对路径创建 StreamSource

Source xslSource = new StreamSource(xslFilePath);
String version = ...; // TODO Get XSLT version of XSL file

TransformerFactory transformerFactory;

if ("2.0".equals(version)) {
    transformerFactory = new net.sf.saxon.TransformerFactoryImpl();
} else {
    transformerFactory = new org.apache.xalan.processor.TransformerFactoryImpl();
}

这可能是最好的方法。请注意,如果您编写一个 SAX ContentReader 来访问 xsl:stylesheet/@version,您可以通过抛出 SAXException 来中止解析。