34

这是一个简单的问题,但我找不到答案。我有一个 XSLT 2.0 样式表,正在尝试用 Java 处理。它依赖于来自 Saxon 的 XSL 元素。

我当前的课程适用于简单的 XSLT 1.0,但我在使用 Saxon 构建的 2.0 XSLT 时遇到了关于无法识别元素的错误。

我不知道如何告诉 Java 使用 Saxon 作为处理器。我在课堂上使用 javax.xml.transform。这是我可以设置的属性吗?我把它设置成什么?谢谢!

编辑 我想出了如何设置属性以使用撒克逊语,但现在我收到了这个错误。

Provider net.sf.saxon.TransformerFactoryImpl not found

如何在我的申请中包含撒克逊人?

4

3 回答 3

74

有多种方法可以做到这一点(按照查找优先顺序):

直接实例化

显式实例化撒克逊工厂(对迈克尔上面的评论表示赞同):

TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()

这种方法意味着您的代码在编译时被锁定为使用 Saxon。这可以被视为优势(没有使用错误处理器运行的风险)或劣势(没有机会在执行时配置不同的处理器 - 甚至是 Saxon Enterprise Edition)。

对于 Saxon-PE,替换为com.saxonica.config.ProfessionalTransformerFactory. 对于 Saxon-EE,替换为com.saxonica.config.EnterpriseTransformerFactory.

指定类名

构造时指定工厂类:

TransformerFactory fact = TransformerFactory.newInstance(
        "net.sf.saxon.TransformerFactoryImpl", null);

注意:从 Java 6 开始可用Java 5 版本没有这个方法。

这种方法允许您在执行时选择处理器,同时仍然避免类路径搜索的成本和风险。例如,您的应用程序可以提供一些配置机制,通过在各种 Saxon 工厂类之间进行选择,允许它使用不同的 Saxon 版本运行。

使用系统属性

javax.xml.transform.TransformerFactory在创建实例之前设置系统属性:

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl");

或在命令行上(为便于阅读而换行):

java -Djavax.xml.transform.TransformerFactory=
        net.sf.saxon.TransformerFactoryImpl YourApp

这种方法的缺点是系统属性会影响整个 Java VM。将此属性设置为选择 Saxon 可能意味着应用程序中的某些其他模块(您可能甚至不知道)开始使用 Saxon 而不是 Xalan,如果该模块使用特定于 Xalan 的 XSLT 构造,则该模块可能会因此失败。

使用属性文件

创建以下文件:

JRE/lib/jaxp.properties

具有以下内容:

javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl

这种方法与使用系统属性具有相似的后果。

服务加载器

在 CLASSPATH 上的任何 JAR 中创建以下文件:

META-INF/services/javax.xml.transform.TransformerFactory

具有以下内容:

net.sf.saxon.TransformerFactoryImpl

这种方法的缺点是对类路径的微小更改可能会导致应用程序使用不同的 XSLT 引擎运行,可能是应用程序从未测试过的引擎。

平台默认

如果以上均未完成,则将TransformerFactory加载平台默认实例。可以在此处找到此可插入层的友好描述。

请注意,这里的“平台”是指 Java VM,而不是运行它的硬件或操作系统。对于所有当前已知的 Java VM,平台默认是 Xalan 版本(仅支持 XSLT 1.0)。无法保证将来每个 Java VM 都将如此。

我认为这个答案是反对 Java 做事方式的论据。

于 2012-07-07T22:54:04.823 回答
0

您可以显式构造 requiredSourceResultobjects 以确保它们是 Saxon 实现而不是默认实现。

于 2012-07-03T15:52:25.133 回答
0

我为 Saxon 解析器编写了一个包装器,以使其使用简单,我称它为“ EasySaxon ”:您可以在此处找到它,其中包含一些示例代码片段。

希望能帮助到你。

弗朗切斯科

于 2015-06-24T08:45:43.793 回答