2つのXSLファイルがあります。1つには、を使用した別のが含まれます<xsl:include>
。メインテンプレートは、ノード値に応じて呼び出す実際のテンプレートを決定し、含まれているテンプレートには実際の変換ルールが含まれています。ここでは特別なことは何もありません。
ただし、含まれているファイルにはスクリプトブロックがあります。
<msxsl:script language="VB" implements-prefix="user">
<msxsl:assembly href="C:\Absolute\Path\MyEscaper.dll" />
<msxsl:using namespace="ZebraEscaper.MyCompany" />
<![CDATA[
Public Function escape(s As String) As String
Return EncodeField(s, True)
End Function
]]>
</msxsl:script>
user:escape()関数は、後で含まれているテンプレートで使用されます。
次に、VS2008XSLTデバッガーに移動します。
メインテンプレートが呼び出さ<xsl:apply-templates>
れ、含まれているテンプレートが実行されます。また、FileNotFound例外が発生し、「ファイルまたはアセンブリ'MyEscaper、Version = 1.0.0.0、Culture = neutral、PublicKeyToken=null'またはその依存関係の1つを読み込めませんでした。システムは指定されたファイルを見つけることができません。」
ここで、含まれているファイルだけに移動して、何にも含まれていないスタンドアロンテンプレートであるかのように実行すると、すべてが機能します。アセンブリが検出され、関数が呼び出されますが、インクルージョンとして設計されたテンプレートとして、結果は明らかに意味がありません。
では、質問-テンプレートが含まれているのに、なぜシステムがアセンブリを見つけられないのでしょうか?
詳しくは
ドキュメントには、「アセンブリパス名は2回解決されます。1回はコンパイル中、もう1回は実行中です」と記載されています。パスに意図的にタイプミスをすると、同じFileNotFound例外が発生しますが、フォーマットが異なり、システムはfile:// C:\ Absolute \ Path\MyEscaper.dllを見つけることができないと言います。ただし、パスが正しい場合、例外はMyEscaper.dll、version = blabla、public token = nullが見つからなかったと主張し、その例外は.Netによって作成されたCompiledStylesheet.dllで発生します。コンパイルされたスタイルシートは、hrefではなく名前でアセンブリを呼び出すように指示されていると思います。また、一時フォルダーにないため、呼び出しは失敗します。
なぜそうなのか?絶対パスが(誤って)相対パスに変換される場所と理由、およびそれを制御するにはどうすればよいですか?