有两个 XSL 文件。一个包括另一个使用<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() 函数稍后在包含的模板中使用。
现在,我使用 VS2008 XSLT 调试器。
主模板调用<xsl:apply-templates>
和包含的模板执行。并且出现 FileNotFound 异常,“无法加载文件或程序集 'MyEscaper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。”
现在,如果我只转到包含的文件并像它是一个独立的模板一样执行它,而不是包含在任何东西中,那么一切正常。找到程序集并调用函数,但显然结果没有意义,因为模板设计为包含。
那么问题来了——为什么在包含模板的情况下系统找不到程序集?
更多信息
文档指出“程序集路径名称被解析两次 - 一次在编译期间,一次在执行期间。” 如果我故意在路径中打错字,我会得到相同的 FileNotFound 异常,但格式不同,系统说它找不到file://C:\Absolute\Path\MyEscaper.dll。但是,当路径正确时,该异常声称它找不到MyEscaper.dll, version=blabla, public token=null,并且该异常发生在由 .Net 创建的 CompiledStylesheet.dll 中。我相信已编译的样式表被告知按名称而不是 href 调用程序集,并且由于它不在其临时文件夹中,因此调用失败。
为什么这样?绝对路径在哪里以及为什么会(错误地)转换为相对路径,我该如何控制它?