如何在Java中选择saxon TransformerFactory

2022-09-01 22:02:08

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

所以我已经读到应该可以做到这一点:

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

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

如何选择萨克森变压器厂?

谢谢


答案 1

执行此操作的正确方法是在获取新的 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 的引用,它就可以使用工厂来配置和获取 Transformer 实例。


答案 2

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

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

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

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


推荐