msxsl:script标记在xslt中的应用
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: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: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#代码写在里面,省去了编写用户控件的麻烦!