有两个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异常,但格式不同,系统会说找不到该异常
文件:://c:\absolute\path\myescaper.dll
. 但是,当路径正确时,异常声明找不到
myescaper.dll,version=blabla,public token=空
,并且该异常发生在.NET创建的compiledStylesheet.dll中。我相信已编译的样式表被要求按名称而不是按href调用程序集,而且由于它不在其临时文件夹中,调用失败。
为什么呢?绝对路径在哪里被翻译(错误地)成相对路径?我如何控制它?