gpt4 book ai didi

.net - 使用程序集在引用的 XSL 模板中编写脚本

转载 作者:行者123 更新时间:2023-12-02 00:42:50 27 4
gpt4 key购买 nike

有两个 XSL 文件。一个包含另一个使用 <xsl:include> .主模板根据节点值决定调用哪些实际模板,包含模板包含实际转换规则。这里没有什么特别的。

但是包含的文件有一个脚本 block :

  <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 调用程序集,并且由于它不在其临时文件夹中,因此调用失败。

为什么会这样?绝对路径在哪里以及为什么被(错误地)转换为相对路径,我如何控制它?

最佳答案

所以。

出于某种原因,在包含的方案中,程序集路径在编译期间和执行期间的解析方式不同。为什么会这样,我没有任何线索。

只找到两个理智的解决方案:

  1. 将引用的程序集中的所有代码移到 XSL 模板中,使其成为嵌入式脚本。在实际首选的小辅助函数的情况下。否则,

  2. 使用强名称对引用的程序集进行签名,将其添加到 GAC,并使用 name 而不是 href 从模板中引用它。这样程序集在编译和执行的时候也会以同样的方式查找,就会找到。

关于.net - 使用程序集在引用的 XSL 模板中编写脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2073577/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com