34

これは簡単な質問ですが、答えが見つかりません。Javaで処理しようとしているXSLT2.0スタイルシートがあります。SaxonのXSL要素に依存しています。

現在のクラスは単純なXSLT1.0で正常に動作しますが、Saxonで構築された2.0XSLTで認識されない要素に関するエラーが発生します。

プロセッサとしてSaxonを使用するようにJavaに指示する方法がわかりません。クラスでjavax.xml.transformを使用しています。これは私が設定できるプロパティですか?何に設定しますか?ありがとう!

編集 済みSaxonを使用するようにプロパティを設定する方法を理解しましたが、このエラーが発生します。

Provider net.sf.saxon.TransformerFactoryImpl not found

アプリケーションにSaxonを含めるにはどうすればよいですか?

4

3 に答える 3

74

これを行うには複数の方法があります (ルックアップの優先順位順):

直接インスタンス化

Saxon ファクトリを明示的にインスタンス化します(上記の Michael のコメントに同意します)。

TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()

このアプローチは、コードがコンパイル時に Saxon を使用するようにロックされることを意味します。これは、利点 (間違ったプロセッサで実行されるリスクがない) または欠点 (実行時に別のプロセッサを構成する機会がない - Saxon Enterprise Edition でさえ) と見なすことができます。

Saxon-PE の場合は、 に置き換えcom.saxonica.config.ProfessionalTransformerFactoryます。Saxon-EE の場合は、 に置き換えcom.saxonica.config.EnterpriseTransformerFactoryます。

クラス名を指定

構築時にファクトリ クラスを指定します。

TransformerFactory fact = TransformerFactory.newInstance(
        "net.sf.saxon.TransformerFactoryImpl", null);

注: Java 6 以降で利用可能ですJava 5 バージョンには、このメソッドはありません。

このアプローチにより、クラスパス検索のコストとリスクを回避しながら、実行時にプロセッサを選択できます。たとえば、アプリケーションは、さまざまな Saxon ファクトリ クラスから選択することにより、さまざまな Saxon エディションで実行できるようにする構成メカニズムを提供できます。

システム プロパティを使用

javax.xml.transform.TransformerFactoryインスタンスを作成する前に、システム プロパティを設定します。

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl");

または、コマンド ラインで (読みやすいように改行しています):

java -Djavax.xml.transform.TransformerFactory=
        net.sf.saxon.TransformerFactoryImpl YourApp

このアプローチには、システム プロパティが Java VM 全体に影響するという欠点があります。このプロパティを設定して Saxon を選択すると、アプリケーション内の他のモジュール (あなたが知らないかもしれません) が Xalan の代わりに Saxon を使用し始め、そのモジュールが Xalan 固有の XSLT コンストラクトを使用している場合、結果として失敗する可能性があります。

プロパティファイルを使用

次のファイルを作成します。

JRE/lib/jaxp.properties

以下の内容で:

javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl

このアプローチは、システム プロパティを使用する場合と同様の結果をもたらします。

サービスローダー

CLASSPATH の任意の JAR に次のファイルを作成します。

META-INF/services/javax.xml.transform.TransformerFactory

以下の内容で:

net.sf.saxon.TransformerFactoryImpl

このアプローチには、クラスパスを少し変更すると、アプリケーションがテストされたことのない別の XSLT エンジンで実行される可能性があるという欠点があります。

プラットフォームのデフォルト

上記のいずれも実行されていない場合、プラットフォームのデフォルトTransformerFactoryインスタンスがロードされます。このプラグ可能性レイヤーの分かりやすい説明は、ここにあります。

ここでの「プラットフォーム」は Java VM を意味し、それが実行されているハードウェアやオペレーティング システムを意味しないことに注意してください。現在知られているすべての Java VM について、プラットフォームのデフォルトは Xalan のバージョンです (XSLT 1.0 のみをサポートします)。これが将来すべての Java VM に常に当てはまるという保証はありません。

この答えは、Javaのやり方に対する議論だと思います。

于 2012-07-07T22:54:04.823 に答える
0

Source必須オブジェクトとオブジェクトを明示的Resultに作成して、デフォルトの実装ではなく、Saxonの実装であることを確認できます。

于 2012-07-03T15:52:25.133 に答える
0

簡単に使用できるようにするために、Saxon パーサーのラッパーを作成し、「EasySaxon 」と呼びました。サンプルのコード スニペットと共に、ここで見つけることができます。

それが役に立てば幸い。

フランチェスコ

于 2015-06-24T08:45:43.793 に答える