有多种方法可以做到这一点(按照查找优先顺序):
直接实例化
显式实例化撒克逊工厂(对迈克尔上面的评论表示赞同):
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 做事方式的论据。