我使用Xalan在我的应用程序,但需要使用撒克逊一个参考实现生成测试输出与比较。 我想在单元测试使用它们两者。 但是,只要我在这个项目.pom加上撒克逊的依赖,应用程序似乎使用撒克逊的测试期间所有XSLT和XPath操作:
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
<version>9.4</version>
<scope>test</scope>
</dependency>
这使得主应用程序生成输出时由于不同的XPath行为失败。 当运行的测试范围主要应用之外它的工作原理。
如何运行使用Xalan的主要应用,但使用撒克逊的测试,在测试过程中?
我曾尝试运行Xalan和撒克逊部件之前,设置以下属性:
System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl ");
System.setProperty("javax.xml.transform.TransformerFactory", "net.sf.saxon.TransformerFactoryImpl");
我也曾尝试把Xalan和撒克逊部分在不同的项目,我也试图从第三个项目使用它们两者具有相同的结果。
避免依托JAXP工厂机制来选择你的转换引擎。 相反,加载要明确引擎:它是更可靠和更快。 对于撒克逊人,调用替换上
TransformerFactory.newInstance()
同
new net.sf.saxon.TransformerFactoryImpl()
和使用的Xalan
new org.apache.xalan.processor.TransformerFactoryImpl()
下面是完整的解决方案:
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);