2010-01-15 48 views
3

有兩個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調用,因爲它不在臨時文件夾中,所以調用失敗。

爲什麼這麼說?何處以及爲什麼絕對路徑會被錯誤地翻譯成相對路徑,我該如何控制它?

+0

您是否試圖從c#/ vb代碼運行xslt?或者你只是運行一個直線xslt。如果來自代碼,請在運行轉換之前發佈如何加載xslt和名稱空間。 – 2010-01-15 20:48:26

+0

正如我所說的,「我去VS2008 XSLT調試器。」這意味着,我打開Visual Studio中的XSL並單擊調試XSLT :) – GSerg 2010-01-15 23:34:09

回答

3

所以。

出於某種原因,在包含的方案中,程序集的路徑在編譯期間和執行期間的解決方式不同。爲什麼是這樣,我沒有線索。發現

只有兩個解決方案理智:

  1. 移動從引用組裝成XSL模板的所有代碼,使它成爲一個嵌入的腳本。實際上首選小幫手功能的情況。否則,

  2. 用強名稱標記引用的程序集,將其添加到GAC中,並使用name而不是href從模板中引用它。通過這種方式,程序集在編譯和執行過程中將以相同的方式查找,並將被找到。