如何在Java中选择Saxon TransformerFactory

25
在我的Web应用程序中,我需要使用Saxon TransformerFactory以使用XSLT 2.0,但由于Web服务器上存在安全管理器,因此我无法使用setProperty方法。
因此,我已经了解到可以采用以下方法:
使用服务API(如JAR规范中详细说明),如果可用,则确定类名。 Services API将在运行时可用的JAR中查找META-INF / services / javax.xml.transform.TransformerFactory文件中的类名。
我在WEB-INF / lib / saxon9.jar中找到了这个文件,但是当我实例化TransformerFactory时,默认工厂始终被选中,而不是Saxon工厂。
如何选择Saxon Transformer Factory?
谢谢

1
以下是所有方法的摘要(以及更多信息):https://dev59.com/_2gu5IYBdhLWcg3wdGsb - Wayne
4个回答

27

在获取新的TransformerFactory时,指定工厂类是正确的方法。

我认为调用特定的工厂实现不会起作用 - 我相信默认系统转换器仍然可能被返回(至少当我在类路径中有xalan和saxon时就发生了这种情况)。

示例:

TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null);

或者在Saxon中使用

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

Javadocs:

从工厂类名获取一个TransformerFactory的新实例。当类路径中存在多个提供程序时,此函数非常有用。它为应用程序提供更多控制权,因为它可以指定应该加载哪个提供程序。一旦应用程序获得了对TransformerFactory的引用,它就可以使用该工厂来配置和获取转换器实例。


1
这适用于Java v6(http://docs.oracle.com/javase/6/docs/api/javax/xml/transform/TransformerFactory.html vs http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/TransformerFactory.html)。 - Jeffrey Knight
1
这在Oracle Fusion Middleware 11.1.1.5.0版本中不起作用,因为它在其客户端jar文件中使用较旧的实现。 - sweetfa

14

你可以尝试在代码中设置系统属性:

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

在获取TransformerFactory实例之前,请执行此操作。

注意:这将强制Tomcat上的所有Web应用程序使用Saxon - 因此您必须确保任何其他正在使用默认设置的Web应用程序都没有问题。


10

创建文件 META-INF/services/javax.xml.transform.TransformerFactory,并写入以下内容: net.sf.saxon.TransformerFactoryImpl。就是这样。


这对我没有起作用。我使用了我的Web应用程序的主要META-INF目录。我需要使用不同的目录吗? - Carsten

5

如果您的应用程序确实需要Saxon并且不能使用其他处理器,则可以直接使用new net.sf.saxon.TransformerFactoryImpl()实例化Saxon TransformerFactory,这样做可能会很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接