22

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

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

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

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

如何选择撒克逊变压器厂?

谢谢

4

4 回答 4

26

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

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

例子:

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

或撒克逊人

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

Java文档:

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

于 2010-08-02T16:01:32.507 回答
11

您可以通过在代码中设置系统属性来尝试吗

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

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

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

于 2010-06-04T10:43:09.167 回答
8

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

于 2011-05-26T16:58:10.427 回答
5

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

于 2010-06-04T13:22:58.160 回答