如何在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可能会很好