如何将Saxon设置为Java中的Xslt处理器?

Jef*_*eff 33 java xslt sax

这是一个简单的问题,但我无法找到答案.我有一个XSLT 2.0样式表,我正在尝试用Java处理.它依赖于Saxon的XSL元素.

我当前的类在使用简单的XSLT 1.0时运行良好,但是我使用使用Saxon构建的2.0 XSLT会收到有关无法识别的元素的错误.

我无法弄清楚如何告诉Java使用Saxon作为处理器.我在班上使用javax.xml.transform.这是我可以设置的属性吗?我该怎么做呢?谢谢!

编辑 我想出如何设置属性使用Saxon,但现在我收到此错误.

Provider net.sf.saxon.TransformerFactoryImpl not found
Run Code Online (Sandbox Code Playgroud)

如何在我的应用程序中包含Saxon?

Way*_*ett 71

有多种方法可以执行此操作(按查找优先顺序):

直接实例化

明确地实例化撒克逊工厂(向迈克尔上面的评论致敬):

TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()
Run Code Online (Sandbox Code Playgroud)

这种方法意味着您的代码在编译时被锁定为使用Saxon.这可以被视为一个优势(没有运行错误的处理器的风险)或缺点(没有机会在执行时配置不同的处理器 - 甚至萨克森企业版).

对于Saxon-PE,替代品com.saxonica.config.ProfessionalTransformerFactory.对于Saxon-EE,替代com.saxonica.config.EnterpriseTransformerFactory.

指定班级名称

构造时指定工厂类:

TransformerFactory fact = TransformerFactory.newInstance(
        "net.sf.saxon.TransformerFactoryImpl", null);
Run Code Online (Sandbox Code Playgroud)

注意:从Java 6开始提供.在Java 5的版本没有此方法.

此方法允许您在执行时选择处理器,同时仍避免类路径搜索的成本和风险.例如,您的应用程序可以提供一些配置机制,允许它通过在各种Saxon工厂类之间进行选择来运行不同的Saxon版本.

使用系统属性

javax.xml.transform.TransformerFactory在创建实例之前设置系统属性:

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl");
Run Code Online (Sandbox Code Playgroud)

或者在命令行上(为便于阅读而破坏了行):

java -Djavax.xml.transform.TransformerFactory=
        cnet.sf.saxon.TransformerFactoryImpl YourApp
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是系统属性会影响整个Java VM.设置此属性以选择Saxon可能意味着应用程序中的某些其他模块(您可能甚至不知道)开始使用Saxon而不是Xalan,如果它使用特定于Xalan的XSLT结构,则该模块可能会失败.

使用属性文件

创建以下文件:

JRE/lib/jaxp.properties
Run Code Online (Sandbox Code Playgroud)

具有以下内容:

javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl
Run Code Online (Sandbox Code Playgroud)

此方法与使用系统属性具有类似的结果.

服务装载机

在CLASSPATH上的任何JAR中创建以下文件:

META-INF/services/javax.xml.transform.TransformerFactory
Run Code Online (Sandbox Code Playgroud)

具有以下内容:

net.sf.saxon.TransformerFactoryImpl
Run Code Online (Sandbox Code Playgroud)

这种方法的缺点是,对类路径的小改动可能导致应用程序使用不同的XSLT引擎运行,也许是应用程序从未测试过的引擎.

平台默认

如果没有完成上述任何操作,则将TransformerFactory加载平台默认实例.可在此处找到此可插拔层的友好描述.

请注意,'platform'在这里表示Java VM,而不是它运行的硬件或操作系统.对于所有当前已知的Java VM,平台缺省值是Xalan的版本(仅支持XSLT 1.0).无法保证将来每个Java VM始终都是如此.

我认为这个答案是反对Java做事方式的论据.