0

私が達成しようとしているのは(Saxon-B 9.1を使用して)です:

1) 以下のサンプル クラスのオブジェクトをパラメーターとして XSLT 変換を実行します。

2) オブジェクトのプロパティは、選択したノードで再帰拡張機能を使用して設定されます

3) 2 番目の XSLT 変換を (別の XML 入力で) 実行し、上記のオブジェクトに値を入力してパラメーターとして渡します。

4) オブジェクトから出力ドキュメントに XML ノードを挿入する

私のクラスは以下です:

public class Example {
.   private NodeSet test;

.   public RequestInfo() {}

.   public void settest(NodeList t) {
.       this.test = t;
.   }
.   public NodeList gettest() {
.       return test;
.   }
}

最初の変換は、(XSLT 内で settest() メソッドを使用して) オブジェクトに問題なく設定されているようです - NodeList に追加された正しいノードを確認できます。

ただし、2 番目の変換を実行し、XSLT 内から gettest() メソッドを呼び出すと、以下のエラーが発生します。

NodeInfo returned by extension function was created with an incompatible Configuration

私は NodeList を使用すべきではないと考えていましたが、Saxon によって認識される別の同等のタイプでしょうか? NodeSet で試してみましたが、同じエラー メッセージが表示されました。

これに関する助けをいただければ幸いです。

4

1 に答える 1

1

間違っていることを正確に確認するのに十分な情報が表示されていませんが、エラー メッセージを説明することはできます。Saxon は、XML ドキュメントとスタイルシートで使用されるすべての名前に整数コードを割り当て、整数比較を使用して名前を比較することにより、部分的に高速なパフォーマンスを実現します。整数から名前へのマッピングが保持される場所は NamePool であり、NamePool は Saxon Configuration オブジェクトによって所有されます。したがって、変換に参加するすべてのドキュメント、スタイルシートなどは、同じ構成の下で作成する必要があります (すべてのノードを、それらが関連付けられているドキュメントの下に作成する必要があるという DOM ルールに少し似ています)。このメッセージは、少なくとも 2 つの異なる Configuration オブジェクトが存在することを意味します。構成は、アプリケーションによって明示的に作成されます。

この XSLT と Java コードの混合は本当に良い考えなのだろうか? 私がよく目にするのは、Java コードが使用されているのは、人々が XSLT で目的の効果を達成する方法を習得していないためです。Saxon で DOM を使用しないことには、多くの正当な理由があります。非常に遅い、より多くのコード行が必要である、スレッドセーフではない、デバッグが難しい、などです。

于 2012-10-17T23:16:16.357 に答える