有兩個XSL文件。一個包括另一個使用<xsl:include>
。主模板根據節點值決定調用哪個實際模板,並且包含的模板包含實際的轉換規則。沒什麼特別的。在引用的XSL模板中使用程序集編寫腳本
但包含的文件有一個腳本塊:
<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>
用戶: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調用,因爲它不在臨時文件夾中,所以調用失敗。
爲什麼這麼說?何處以及爲什麼絕對路徑會被錯誤地翻譯成相對路徑,我該如何控制它?
您是否試圖從c#/ vb代碼運行xslt?或者你只是運行一個直線xslt。如果來自代碼,請在運行轉換之前發佈如何加載xslt和名稱空間。 – 2010-01-15 20:48:26
正如我所說的,「我去VS2008 XSLT調試器。」這意味着,我打開Visual Studio中的XSL並單擊調試XSLT :) – GSerg 2010-01-15 23:34:09