如何在Java中选择saxon TransformerFactory

时间:2010-06-03 17:09:11

标签: java tomcat servlets sax xslt-2.0

在我的Web应用程序中,我需要使用Saxon TransformerFactory才能使用XSLT 2.0,但我不能使用setProperty方法,因为我在Web服务器上没有这个权限,并且有一个安全管理器。

所以我读过应该可以这样做:

  

使用Services API(如JAR规范中详述)(如果可用)来确定类名。 Services API将在运行时可用的jar文件中的META-INF / services / javax.xml.transform.TransformerFactory文件中查找类名。

我在WEB-INF / lib / saxon9.jar中找到了这个文件但是当我实现TransformerFactory时,总是选择默认工厂而不是Saxon工厂。

如何选择Saxon Transformer Factory?

由于

4 个答案:

答案 0 :(得分:24)

执行此操作的正确方法是在获取新的TransformerFactory时指定工厂类。

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

示例:

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

或撒克逊人

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

的Javadoc:

  

获取a的新实例   工厂类的TransformerFactory   名称。此功能非常有用   有多个提供商   类路径。它提供了更多的控制权   它可以指定的应用程序   应该加载哪个提供者。一旦   一个应用程序获得了一个   它引用了一个TransformerFactory   可以使用工厂配置和   获取变压器实例。

答案 1 :(得分:11)

您可以尝试在代码中设置系统属性,如

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

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

注意:这将强制Tomcat上的所有Web应用程序使用saxon - 因此您必须确保使用默认值的任何其他Web应用程序都可以。

答案 2 :(得分:8)

使用内容META-INF/services/javax.xml.transform.TransformerFactory创建文件net.sf.saxon.TransformerFactoryImpl。就是这样。

答案 3 :(得分:5)

如果您的应用程序确实需要saxon并且不能与其他处理器一起使用,那么直接使用new net.sf.saxon.TransformerFactoryImpl()

实例化saxon TransformerFactory可能会很好