web-dev-qa-db-ja.com

JavaでSaxonをXsltプロセッサとして設定する方法は?

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

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

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

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

Provider net.sf.saxon.TransformerFactoryImpl not found

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

33
Jeff

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

直接インスタンス化

Saxon factory を明示的にインスタンス化します(上記の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=
        cnet.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インスタンスがロードされます。このプラグ可能層のわかりやすい説明は、 here にあります。

ここでの「プラットフォーム」とは、Java VMであり、それが実行されているハードウェアまたはオペレーティングシステムではありません。現在のすべての既知のJava VMの場合、プラットフォームのデフォルトはXalanのバージョンです(XSLT 1.0のみをサポートします)。これがすべてのJava =VM将来的に

この答えは、Java物事のやり方に対する反対意見だと思います。

69
Wayne Burkett

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

それが役に立てば幸い。

フランチェスコ

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

0
user268396