これは簡単な質問ですが、答えが見つかりません。 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をアプリケーションに含めるにはどうすればよいですか?
これを行うには、複数の方法があります(ルックアップの優先順)。
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物事のやり方に対する反対意見だと思います。
必要なSource
およびResult
オブジェクトを明示的に構築して、デフォルトのオブジェクトではなく、Saxon実装であることを確認できます。