8

我在我的应用程序中使用 Xalan,但需要使用 Saxon 和参考实现来生成测试输出以进行比较。我想在单元测试期间同时使用它们。但是,一旦我在项目 .pom 中添加对 Saxon 的依赖项,应用程序似乎在测试期间将 Saxon 用于所有 xslt 和 XPath 操作:

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

4

2 回答 2

11

避免依赖 JAXP 工厂机制来选择转换引擎。而是明确加载您想要的引擎:它更可靠,速度更快。对于撒克逊人,将调用替换为

TransformerFactory.newInstance()

new net.sf.saxon.TransformerFactoryImpl()

并供 Xalan 使用

new org.apache.xalan.processor.TransformerFactoryImpl()
于 2012-06-27T13:59:43.107 回答
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);
于 2012-06-28T08:56:01.990 回答