【问题标题】:How to select saxon TransformerFactory in Java如何在 Java 中选择撒克逊 TransformerFactory
【发布时间】: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 工厂。

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

谢谢

【问题讨论】:

标签: java tomcat servlets sax xslt-2.0


【解决方案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 它 可以使用工厂配置和 获取转换器实例。

      【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这对我不起作用。我使用了我的 webapp 的主 META-INF 目录。我需要使用其他的吗?
      猜你喜欢
      • 1970-01-01
      • 2014-03-30
      • 2016-01-25
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      相关资源
      最近更新 更多