使用的Xalan一起撒克逊(Using Xalan alongside Saxon)

2019-06-25 19:26发布

我使用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和撒克逊部分在不同的项目,我也试图从第三个项目使用它们两者具有相同的结果。

Answer 1:

避免依托JAXP工厂机制来选择你的转换引擎。 相反,加载要明确引擎:它是更可靠和更快。 对于撒克逊人,调用替换上

TransformerFactory.newInstance()

new net.sf.saxon.TransformerFactoryImpl()

和使用的Xalan

new org.apache.xalan.processor.TransformerFactoryImpl()


Answer 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);


文章来源: Using Xalan alongside Saxon