2012-04-10 6 views
4

XSL変換で同じファイルを複数回読み込むと、警告がスローされます。 Stylesheet module file:/Users/blake/Documents/workspace/course-connect-parent/course-connect-publisher/src/main/xsl/config.xsl is included or imported more than once. This is permitted, but may lead to errors or unexpected behaviorXSLTで重複インポートを処理する方法は?

しかし、同じxslを複数の 'children' xsl呼び出し(例えば、重要な機能を含むutil.xsl)でインポートする必要がある場合、このような状況は避けられないようです。

これらの警告や回避策を避ける方法はありますか?ここで

は、問題設定である:

FILE_A.xsl

imports FILE_B.xsl and FILE_C.xsl 
uses functions/parameters from util.xsl, which it gets from FILE_B.xsl & FILEC.xsl 
calls templates in FILE_B.xsl 
calls templates in FILE_C.xsl 

FILE_B.xsl

imports util.xsl 
contains templates used by FILE_A.xsl 
uses functions/parameters from util.xsl 

FILE_C.xsl

imports util.xsl 
contains templates used by FILE_A.xsl 
uses functions/parameters from util.xsl 

util.xsl

Contains functions/variables used by FILE_A, FILE_B, FILE_C 
+0

"奇妙な" XSLTプロセッサを使用しています。私はXSLTを12年以上使用しており、私は ' 'を大量に使っていますが、そのような警告は見たことがありません。同じスタイルシートモジュールを複数回インポートすることはエラーではありません。単にこれらの警告を無視してください(または、XSLTプロセッサーを変更してしまった場合)。 –

+0

EclipseとOxygenの両方で最新のバージョンのSaxonを使用しています。注目される答えの1つとして、これはSaxonの「特徴」であると思われます。 – Riplikash

答えて

8

これらのメッセージは、最近のリリースのSaxonによって生成されています。同じファイルを複数回インポートするのは間違いではありませんが、一部のプロセッサ(Saxonの以前のリリースを含む)では非常に非効率です。それはまた不要であり、コードをデバッグするのが非常に困難になる可能性があります。基本的には、同じ優先順位のテンプレートルールが複数存在することを意味します。

XSLTでは、他の言語とは異なり、モジュールは依存するすべてのモジュールをインポートする必要はありません。スタイルシートの任意の場所にインポートが必要です。 A.xslがutil.xslを使用していて、たくさんの場所でA.xslを再利用したいのであれば、A.xslがインポートまたはインクルード宣言を使用して依存関係を宣言すれば便利です。 xslもutil.xslを使用すると、このような複数のインポートの状況が発生します。

xsl:next-matchから完全に奇妙な効果を得たユーザーと、病的に悪いコンパイル時のパフォーマンスを得たユーザーの2つのインシデントのためにメッセージを追加しました。 100,000の異なるルートと、それゆえに約100,000の異なる輸入優先順位があります。このような問題が起こって再び起こらないようにする傾向が常にあり、その警告はそれに対する応答ですが、健康と安全の警告のように、バランスが正しいことを知るのは難しいです。すべてが正常に動作している場合は警告を無視できます。本当に必要な場合は、ErrorListener内のメッセージをフィルタリングして常に抑制することができます。

+0

Ah、そうですか。私はそれがC++のように働いていると思った。それは今より多くの意味があります。ありがとう。 – Riplikash

+0

実際、私はまだ何かを誤解しているように見えます。 A.xslがutil.xsl、B.xsl、およびC.xslをインポートする場合は、B.xslおよびC.xslにutil.xslを使用できるはずです。 しかし、OxygenとEclipseでは、その状況でエラーが報告されます。輸入は、(B.xslからA.xslへ)上向きに伝播しているように見えますが、下向きではありません。 A.xslにインポートを配置した場合、BとCでエラーが発生しますが、インポートをBに入れてもエラーは発生しませんが、警告は表示されます(無視できますが、彼らはまだ私をバグします)。 – Riplikash

+0

oXygen(Eclipseについてはわかりません)では、スタイルシートモジュールが関連モジュールのグループの一部であることを宣言できます。この場合、モジュールはスタンドアロンスタイルシートとして有効にする必要はありません。 –

2

あなただけの、そのコレクションにスタイルシートを使用している場合、すなわち自立トップレベルのスタイルシートとしてFILE_C.xslを使用することはありません、あなたは単にutilsの輸入を取ることができます.xslを指定すると、インポートにはグローバルスコープが設定されます。そのため、FILE_C.xslのテンプレートはインポートツリーの上位にインポートされても、utils.xslからテンプレートを参照します。 utils.xslは一度だけインポートされ、警告が表示されます。

また、そのまま残しても問題はありません。エラーではなく、システムで実際にエラー以外で気になるはずはありません。どのXSLTシステムがそれですか?たぶん、その警告であまり積極的でない選択肢がありますか?

+0

多分私のエディタは正しく動作していないかもしれませんが、インポートがダウンして伝播するようなものではないようです。私がAでインポートすると、BとCはそれを認識しません。私がCとBでインポートした場合、Aはそれを認識しています。それは今どのように動作するはずですか? 私は酸素とIntelliJ、btwで編集しています。 – Riplikash

+0

編集者はいつも知っているとは限りません(私はあなたに酸素を伝えることができると思いますが)それは編集者が未定義の変数を持っていると思うかもしれないルールですが、間違っていて無視してxsltで実行します:-) –

関連する問題