xsl:importまたはxsl:includeの相対パス
-
02-07-2019 - |
質問
VBScriptを使用して、XMLオブジェクトでXSLT変換を実行しようとしています。
私が翻訳しているXSLファイルには、<xsl:import href="script.xsl"/>
ディレクティブが含まれています。絶対URL(http://localhost/mysite/script.xsl
)を使用すると、スタイルシートが正常にインポートされます。ただし、相対パス(script.xsl
)を使用すると、<!> quot; resource not found。<!> quot;と報告されます。これを一連のマシン間で移植できるようにする必要があるため、相対URIを使用できるようにする必要があります。提案はありますか?
注:
- VBScriptファイルは
http://localhost/myscript.asp
にあります
- 最初のXSLファイルは
http://localhost/mysite/styles.xsl
にあります
- 2番目のXSLファイルは
mysite/script.xsl
にあります
- 相対パスの使用
myscript.asp
も機能しません
補遺:
皆さん、ご回答ありがとうございます。これを行っているコードを詳しく調べると、見知らぬ人になります。 styles.xsl
は、かなり珍しいコードのコンパイルです。起こることは、<xml src=...>
がXMLチャンク(<=>)として<=>のHTML出力に含まれ、そのチャンクがクライアント側でVBScriptを使用してスタイルシートとしてロードされることです。次に、このスタイルシートを使用して、XMLHTTPを介して取得されるXMLチャンクを変換します。したがって、問題は<=>のコンテキストがクライアント側のHTMLであり、<=>の場所とは関係がないことです。
解決 6
最初の試行:
script.xslを別のxmlチャンクとして含め、想像できるあらゆる方法でimportステートメントを変更しようとしましたが、成功しませんでした。
最終的な解決策:
script.xslを含めるための絶対URLは最初から機能していたため、最終的な解決策は、正しいdoctypeを使用してstyle.xslをstyle.aspに変換することでした。このファイルで、サーバー名、プロトコル、およびパスを取得し、aspを使用してimportステートメントの適切な場所にエコーすることができました。次に、このファイルがmysscript.aspに含まれると、サーバーの正しい絶対URLが設定されました。これはちょっとしたハックですが、この複雑な状況を解決する唯一の方法です。
他のヒント
xsl:import、xsl:include、およびdocument()関数の現在のディレクトリは、それらを使用する変換を含むディレクトリです。したがって、使用していると言ったxsl:importディレクティブは動作するはずです。
私が考えることができるのはこれだけです。相対パスを使用すると、ファイルはファイルシステムから直接読み取られ、絶対URIを使用すると、Webサーバーから取得されます。スクリプトがこのディレクトリ内のファイルを読み取れないようにするセキュリティ設定がある可能性はありますか?
@Jonあなたは非常に近いと思います...しかし、そうすべきではありません...
<xsl:import href="/mysite/script.xsl"/>
...先頭にスラッシュを付けますか?
Sysinternals Process Monitor を実行して、これに対処します。このツールを実行すると、スクリプトが存在しなくても、スクリプトが開こうとするファイルを実際に確認できます。
<!> quot;現在のディレクトリ<!> quot;相対パスの目的では、XSLファイルではなく、ASPページの場所がありますか?つまり、まだお持ちでない場合は、次のことを試してください:
<xsl:import href="mysite/script.xsl"/>
私が見ることができないライブラリで使用されているカスタムURIリゾルバーがあるため、この問題に遭遇することがよくあります(または、関連するドキュメントを読んでいなかったために知りません)。仕様であるかどうかはわかりませんが、Saxon / javaの世界では、カスタムURIリゾルバーは、include / importステートメントとdocument()関数のURIを解決しようとする際に最初にクラックを受けます。 URIを解決できない場合、デフォルトのURIリゾルバーは試行を行います。通常は、URIが絶対の場合に失敗することはありません。
そのため、おそらく、アプリコンテキストに基づいたコンテキスト駆動型URIリゾルバーを使用しているのは、ASPエンジンの何かです。
JS、イメージ、またはCSSファイルをロードするときに、approotまたはwebrootを定義する変数が必要です。
<xsl:import href="{$approot}/somedir/script.xsl"/>
またはXMLに値がある場合、
<xsl:import href="{/root/@approot}/somedir/script.xsl"/>