如何在 Java 中选择撒克逊 TransformerFactory
Posted
技术标签:
【中文标题】如何在 Java 中选择撒克逊 TransformerFactory【英文标题】:How to select saxon TransformerFactory in Java 【发布时间】:2011-02-27 10:22:57 【问题描述】:在我的 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 工厂。
如何选择撒克逊变压器厂?
谢谢
【问题讨论】:
可以在此处找到以下(以及更多)所有方法的摘要:***.com/questions/11314604/… 【参考方案1】:你可以尝试在你的代码中设置系统属性吗
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
在获取 TransformerFactory 实例之前执行此操作。
注意:这将强制 Tomcat 上的所有 webapps 使用 saxon - 因此您必须确保使用默认设置的任何其他 webapps 都可以。
【讨论】:
【参考方案2】:如果您的应用程序确实需要 saxon 并且不能与其他处理器一起使用,那么直接使用 new net.sf.saxon.TransformerFactoryImpl()
实例化 saxon TransformerFactory 可能会很好
【讨论】:
【参考方案3】:正确的方法是在获取新的 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 它 可以使用工厂配置和 获取转换器实例。
【讨论】:
这适用于 Java v6 (docs.oracle.com/javase/6/docs/api/javax/xml/transform/… vs docs.oracle.com/javase/1.5.0/docs/api/javax/xml/transform/…) 这不适用于 Oracle Fusion Middleware 11.1.1.5.0 版本,因为它在其客户端 jar 文件中使用较旧的实现。【参考方案4】:创建文件META-INF/services/javax.xml.transform.TransformerFactory
,内容为:net.sf.saxon.TransformerFactoryImpl
。就是这样。
【讨论】:
这对我不起作用。我使用了我的 webapp 的主 META-INF 目录。我需要使用其他的吗?以上是关于如何在 Java 中选择撒克逊 TransformerFactory的主要内容,如果未能解决你的问题,请参考以下文章