我在我的应用程序中使用Xalan,但需要使用Saxon和参考实现来生成测试输出以进行比较。我想在单元测试中使用它们。 但是,只要我在项目.pom中添加对Saxon的依赖,应用程序似乎在测试期间对所有xslt和XPath操作使用Saxon:
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
<version>9.4</version>
<scope>test</scope>
</dependency>
由于不同的XPath行为,这使得主应用程序在生成输出时失败。在测试范围之外运行主应用程序时,它可以正常工作。
如何使用Xalan运行主应用程序,但是在测试期间使用Saxon进行测试?
我在运行Xalan和Saxon部件之前尝试设置以下属性:
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl ");
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
我也尝试将Xalan和Saxon部分放在不同的项目中,我也尝试在第三个项目中使用它们,结果相同。
答案 0 :(得分:10)
避免依赖JAXP工厂机制来选择转换引擎。而是明确加载您想要的引擎:它更可靠,更快。对于Saxon,请替换
上的呼叫TransformerFactory.newInstance()
与
new net.sf.saxon.TransformerFactoryImpl()
和Xalan使用
new org.apache.xalan.processor.TransformerFactoryImpl()
答案 1 :(得分:2)
以下是完整性的解决方案:
System.setProperty(XPathFactory.DEFAULT_PROPERTY_NAME + ":"
+ XPathFactory.DEFAULT_OBJECT_MODEL_URI,
"org.apache.xpath.jaxp.XPathFactoryImpl");
System.setProperty(XPathFactory.DEFAULT_PROPERTY_NAME + ":"
+ NamespaceConstant.OBJECT_MODEL_SAXON,
"net.sf.saxon.xpath.XPathFactoryImpl");
XPathFactory jaxpFactory =
XPathFactory.newInstance(XPathFactory.DEFAULT_OBJECT_MODEL_URI);
XPathFactory saxonFactory =
XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);