如何将 Saxon 设置为 Java 中的 Xslt 处理器? [英] How to set Saxon as the Xslt processor in Java?

查看:23
本文介绍了如何将 Saxon 设置为 Java 中的 Xslt 处理器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

This is a simple question, but one I cannot find the answer to. I have an XSLT 2.0 stylesheet that I'm trying to process in Java. It relies on XSL elements from Saxon.

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

My current class works fine with simple XSLT 1.0, but I'm getting errors about unrecognized elements with my 2.0 XSLT built with Saxon.

我不知道如何告诉 Java 使用 Saxon 作为处理器.我在我的班级中使用 javax.xml.transform.这是我可以设置的属性吗?我把它设置成什么?谢谢!

I cannot figure out how to tell Java to use Saxon as the processor. I'm using javax.xml.transform in my class. Is this a property I can set? What do I set it to? Thanks!

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

Edited I figured out how to set the property to use Saxon, but now I'm getting this error.

Provider net.sf.saxon.TransformerFactoryImpl not found

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

How do I include Saxon in my application?

推荐答案

有多种方法可以做到这一点(按查找优先级排序):

There are multiple ways to do this (in order of lookup precedence):

显式实例化 撒克逊工厂(对上面迈克尔的评论表示赞同):

Explicitly instantiate the Saxon factory (with a nod to Michael's comment above):

TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()

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

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

For Saxon-PE, substitute com.saxonica.config.ProfessionalTransformerFactory. For Saxon-EE, substitute com.saxonica.config.EnterpriseTransformerFactory.

在构造时指定工厂类:

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

注意:从 Java 6 开始可用.Java 5 版本没有这个方法.

Note: available as of Java 6. The Java 5 version does not have this method.

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

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

Set the javax.xml.transform.TransformerFactory system property before creating an instance:

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

或者在命令行上(为了可读性而断行):

Or on the command line (line broken for readability):

java -Djavax.xml.transform.TransformerFactory=
        net.sf.saxon.TransformerFactoryImpl YourApp

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

创建以下文件:

JRE/lib/jaxp.properties

内容如下:

javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl

这种方法与使用系统属性的结果相似.

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

Create the following file in any JAR on the CLASSPATH:

META-INF/services/javax.xml.transform.TransformerFactory

内容如下:

net.sf.saxon.TransformerFactoryImpl

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

如果以上都没有完成,那么平台默认的TransformerFactory 实例将被加载.可以在 这里.

If none of the above are done, then the platform default TransformerFactory instance will be loaded. A friendly description of this plugability layer can be found here.

请注意,此处的平台"是指 Java VM,而不是运行它的硬件或操作系统.对于所有当前已知的 Java VM,平台默认为 Xalan 版本(仅支持 XSLT 1.0).不能保证将来每个 Java 虚拟机都会如此.

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

I'd consider this answer an argument against the Java way of doing things.

这篇关于如何将 Saxon 设置为 Java 中的 Xslt 处理器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆