xslt被應用在對xml檔案的解析中,在asp.net編程中,使用xml控制項可以指定DocumentSource屬性以載入xml檔案,指定TransformSource屬性以載入xslt檔案,xml控制項會自動將轉換後的結果顯示在頁面上。xslt本身也支援很多xpath函數,以及一些簡單的邏輯語句,如if,choose-when-otherwise,for-each等,另外在xslt中也可以自訂方法(在xslt中稱之為模板)被其它的代碼重複調用,有關xslt的詳細介紹可以參考W3school的XSLT教程。
自從微軟的MOSS出現以來,xslt的應用越來越廣泛,有時候我們也會碰到xslt與javascript以及一些伺服器端語言之間的互動問題,如我們需要根據javascript代碼中某一變數的值來決定是否在頁面上輸出內容,這個時候就需要在xslt中使用msxsl:script標記了。
msxsl:script標記由Microsoft支援,它本身可以支援幾種不同的語言,如C#,VB.NET,JScript等,具體的使用方法和介紹可以參考下msdn,http://msdn.microsoft.com/en-us/library/533texsx(VS.71).aspx。另外,這裡還有一篇文章也詳細介紹了如何在xslt中使用msxsl:script標記,http://blog.joycode.com/saucer/archive/2004/05/12/21273.joy。
基本上,我們在xslt中可以直接使用msxsl:script標記中定義好的公用方法和類型,如果是伺服器端語言,必須確保方法或類型是public的,而且參數或傳回值的類型在傳遞和接收時必須相同(有些參數類型在xslt中是不被支援的,大多數情況下我們可能會使用到nodelist類型)。當然,在使用伺服器端語言時,程式集和名稱空間的引用也是必要的,這裡有一個例子:
<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#代碼寫在裡面,省去了編寫使用者控制項的麻煩!