8

アプリケーションで 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 のパーツを別のプロジェクトに配置しようとしました。また、3 番目のプロジェクトから両方を使用しようとしましたが、同じ結果になりました。

4

2 に答える 2

11

変換エンジンを選択するためにJAXPファクトリメカニズムに依存することは避けてください。代わりに、必要なエンジンを明示的にロードします。これは、はるかに信頼性が高く、はるかに高速です。Saxonの場合は、

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 に答える