自从微软的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,如需转载请自行联系原作者