自從微軟的MOSS出現以來,xslt的應用越來越廣泛,有時候我們也會碰到xslt與javascript以及一些伺服器端語言之間的互動問題,如我們需要根據javascript代碼中某一變量的值來決定是否在頁面上輸出内容,這個時候就需要在xslt中使用msxsl:script标記了。
基本上,我們在xslt中可以直接使用msxsl:script标記中定義好的公共方法和類型,如果是伺服器端語言,必須確定方法或類型是public的,而且參數或傳回值的類型在傳遞和接收時必須相同(有些參數類型在xslt中是不被支援的,大多數情況下我們可能會使用到nodelist類型)。當然,在使用伺服器端語言時,程式集和名稱空間的引用也是必要的,這裡有一個例子:
<a></a>
<msxsl:script language="C#" implements-prefix="user">
<msxsl:using namespace="System.Web" />
<msxsl:assembly name="System.Web" />
public bool matchCurrUrl(string loc)
{
return HttpContext.Current.Request.Url.ToString().ToLower().IndexOf(loc.ToLower()) != -1;
}
</msxsl:script>
msxsl:using标記和msxsl:assembly标記分别用來引用名稱空間和程式集,理論上它們是可以被寫在xslt檔案的任何位置的。msxsl:script标記被辨別為C#語言,而且matchCurrUrl方法中使用了HttpContext全局對象,該對象隸屬于System.Web名稱空間,是以在使用前必須添加程式集引用和名稱空間。不要指望xslt會自動為你加載程式集和名稱空間引用,因為msxsl:script标記并非w3c标準,你在使用它之前也要進行申明,如下面兩行:
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
如果在msxsl:script标記中使用的是用戶端語言,如javascript,則要注意避免使用用戶端浏覽器對象,如window、document等,因為xslt本身是在伺服器端解析的,伺服器并不知道用戶端的行為,我們在msxsl:script标記中編寫的javascript代碼應該會被映射成伺服器端方法才能被正确解析。如果你想在互動過程中得到用戶端通路的頁面位址,最好的方法莫過于在C#中使用HttpContext.Current.Request.Url,而不要在javascript中使用document.location或window.location。
使用msxsl:script标記可以省去開發過程中的很多麻煩,按照傳統的開發習慣,如果我們想在xslt中插入C#代碼,則一般的做法是将代碼寫在使用者控件中,然後在xslt中輸出使用者控件的引用标記。如果直接使用msxsl:script标記,你可以将所有的C#代碼寫在裡面,省去了編寫使用者控件的麻煩!
本文轉自Jaxu部落格園部落格,原文連結:http://www.cnblogs.com/jaxu/archive/2010/06/29/1767688.html,如需轉載請自行聯系原作者