使用Xalan和Saxon一起使用

时间:2012-06-27 11:08:58

标签: xslt maven xpath saxon xalan

我在我的应用程序中使用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部分放在不同的项目中,我也尝试在第三个项目中使用它们,结果相同。

2 个答案:

答案 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);