网络编程
位置:首页>> 网络编程>> XML编程>> 用XML创建可排序、分页的数据显示页面(3)

用XML创建可排序、分页的数据显示页面(3)

 来源:孟宪会之精彩世界 发布时间:2008-04-22 18:25:00 

标签:xml,排序,数据

下面我们就分析一下是如何实现的。比如下面的层次关系:
   <客户关系表>
   <客户>
   <序号></序号>
   <姓名></姓名>
   <电子邮件></电子邮件>
   </客户>
   </客户关系表>

假如我们的XSLT中有这样一个选择模板的句子:
  

 <xsl:apply-templates select="/客户关系表"/>

为了实现通用性的要求,我们可以使用通配符:
  

 <xsl:apply-templates select="/*"/>

这里我们使用了子运算符"/",它选择了根下的所有节点,两者的不同点在于:"/客户关系表"选择的是根下的客户关系表子节点,而"/*"选择的是根下所有的直接子节点,在上面的XML数据格式中,二者是完全等价的。

对于下面的for-each循环来说:
  

 <xsl:for-each select="客户">
   <xsl:sort select="序号" order="ascending"/>
   </xsl:for-each>

 我们可以改变成这样的形式:

   <xsl:for-each select="./*">
   <xsl:sort select="./*[1]" order="ascending"/>
   </xsl:for-each>

这里"./*"表示你应当包含进去当前节点下所有的一级子节点,语法"./*[1]"表示的是选择当前节点中的第一个子节点。

另外还有一个地方可以改进的是<xsl:value-of select="序号"/>,我们可以把它改成<xsl:value-of select="."/>,表示在每一次循环中选择当前节点。

在我们的函数中,还使用了一些硬代码,如果不做改动的话,我们的通用性还是实现不了,因此,我们下面就看看如何替换硬代码中的语句。

在创建表头的时候,我们使用了<td onClick="sort(‘序号‘)"> 序号</td>的语句,如果XML数据里没有序号节点的话,这里显然会出现错误的,为了实现通用性,我们自定义了一个函数getName,来取得所要显示的节点的名称:
   

<td>
   <xsl:attribute name="onClick">
   Sort(‘<xsl:value-of select="user:getName(.)"/>‘)
   </xsl:attribute>
   <xsl:value-of select="user:getName(.)"/>
   </td>

自定义函数是XSLT的一个突出的功能,要使用这个特性,我们得用msxml:script元素来定义,同时,必须在样式单定义的时候指定一个用户定义的名字空间。下面就是我们使用自定义函数的全部内容:
  

 <xsl:stylesheet xmlns:xsl=http://www.w3.org/1999/XSL/Transform
   xmlns:msxsl="urn:schemas-microsoft-com:xslt"
   xmlns:user="http://lucky.myrice.com"
   version="1.0">
   <msxsl:script language="VBScript" implements-prefix="user">
   <![CDATA[ 
   function getName(node)
   getName = node.item(0).nodeName
   end function
   ]]> 
   </msxsl:script>

在我们的XSLT文件中,使用了两个循环,我们分别进行相应的更改,第一处:显示表头的地方改为<xsl:for-each select="./*[1]/*">,它等同于<xsl:for-each select="客户关系表/客户[1]/*">;第二处循环是显示每行记录,改成<xsl:for-each select="./*">。

还有其他的地方需要更改的,请参见后面的完整源代码部分。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com