如何在Java中选择saxon TransformerFactory

如何在Java中选择saxon TransformerFactory,java,tomcat,servlets,sax,xslt-2.0,Java,Tomcat,Servlets,Sax,Xslt 2.0,在我的web应用程序中,为了使用XSLT2.0,我需要使用Saxon TransformerFactory,但我不能使用setProperty方法,因为我在web服务器上没有此权限,并且有一个安全管理器 因此,我读到应该可以做到这一点: 如果可用,请使用服务API(如JAR规范中所述)来确定类名。服务API将在运行时可用的JAR文件META-INF/Services/javax.xml.transform.TransformerFactory中查找类名 我在WEB-INF/lib/saxon9.

在我的web应用程序中,为了使用XSLT2.0,我需要使用Saxon TransformerFactory,但我不能使用setProperty方法,因为我在web服务器上没有此权限,并且有一个安全管理器

因此,我读到应该可以做到这一点:

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

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

如何选择萨克森变压器厂


谢谢

您能在代码中设置系统属性吗

System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
在获取TransformerFactory实例之前执行此操作


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

如果您的应用程序确实需要saxon,并且无法与其他处理器一起使用,则可以直接使用
new实例化saxon TransformerFactorynet.sf.saxon.TransformerFactoryImpl()

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

我认为调用一个特定的工厂实现是行不通的——我相信默认的系统转换器可能仍然会返回(至少在类路径中有xalan和saxon时是这样)

例如:

TransformerFactory tFactory = TransformerFactory.newInstance("org.apache.xalan.processor.TransformerFactoryImpl",null);
还是撒克逊人

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

获取一个新实例 来自工厂类的TransformerFactory 名称此函数在以下情况下非常有用: 中有多个提供程序 类路径。它给了我们更多的控制权 可以指定的应用程序 应该加载哪个提供程序。一旦 一项申请已获得 对TransformerFactory it的引用 可以使用工厂来配置和 获取transformer实例


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

这在Java v6(vs)中起作用,但在Oracle Fusion Middleware 11.1.1.5.0版本中不起作用,因为它在客户机jar文件中使用了较旧的实现。以下(以及更多)所有方法的摘要可在此处找到:这对我不起作用。我使用了我的webapp的主META-INF目录。我需要换一个吗?