- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这是一个简单的问题,但我找不到答案。我有一个 XSLT 2.0 样式表,正在尝试用 Java 处理。它依赖于来自 Saxon 的 XSL 元素。
我当前的类(class)在简单的 XSLT 1.0 上运行良好,但我在使用 Saxon 构建的 2.0 XSLT 时遇到了关于无法识别元素的错误。
我不知道如何告诉 Java 使用 Saxon 作为处理器。我在类里面使用 javax.xml.transform。这是我可以设置的属性吗?我把它设置成什么?谢谢!
已编辑我想出了如何设置属性以使用 Saxon,但现在我收到了这个错误。
Provider net.sf.saxon.TransformerFactoryImpl not found
如何在我的申请中包含 Saxon?
最佳答案
有多种方法可以做到这一点(按查找优先顺序):
显式实例化 Saxon factory (对上面迈克尔的评论表示赞同):
TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()
这种方法意味着您的代码在编译时被锁定为使用 Saxon。这可以被视为优势(没有使用错误处理器运行的风险)或劣势(没有机会在执行时配置不同的处理器 - 甚至是 Saxon Enterprise Edition)。
对于 Saxon-PE,替换为 com.saxonica.config.ProfessionalTransformerFactory
。对于 Saxon-EE,替换为 com.saxonica.config.EnterpriseTransformerFactory
。
在构造时指定工厂类:
TransformerFactory fact = TransformerFactory.newInstance(
"net.sf.saxon.TransformerFactoryImpl", null);
注意:available as of Java 6 . Java 5 version没有这个方法。
这种方法允许您在执行时选择处理器,同时仍然避免类路径搜索的成本和风险。例如,您的应用程序可以提供一些配置机制,通过在各种 Saxon 工厂类之间进行选择,使其能够在不同的 Saxon 版本上运行。
在创建实例之前设置javax.xml.transform.TransformerFactory
系统属性:
System.setProperty("javax.xml.transform.TransformerFactory",
"net.sf.saxon.TransformerFactoryImpl");
或在命令行上(为便于阅读而换行):
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 中创建以下文件:
META-INF/services/javax.xml.transform.TransformerFactory
内容如下:
net.sf.saxon.TransformerFactoryImpl
这种方法的缺点是对类路径的微小更改可能会导致应用程序使用不同的 XSLT 引擎运行,可能是应用程序从未测试过的引擎。
如果以上都没有做,那么平台默认的TransformerFactory
实例将会被加载。可以在 here 找到此可插入层的友好描述。 .
请注意,这里的“平台”是指 Java VM,而不是运行它的硬件或操作系统。对于所有当前已知的 Java VM,平台默认是 Xalan 版本(仅支持 XSLT 1.0)。不能保证将来每个 Java VM 都会如此。
我认为这个答案是反对 Java 做事方式的论据。
关于java - 如何将 Saxon 设置为 Java 中的 Xslt 处理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314604/
我是一名优秀的程序员,十分优秀!