在我的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?
由于
答案 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()