如何在Java中选择saxon TransformerFactory

在我的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?

谢谢

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

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

例:

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

或撒克逊人

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

的Javadoc:

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

你能尝试在代码中设置系统属性吗?

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

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

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

创建文件META-INF/services/javax.xml.transform.TransformerFactory ,内容为: net.sf.saxon.TransformerFactoryImpl 。 而已。

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