这是一个简单的问题,但我无法找到答案.我有一个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做事方式的论据.