您的位置:首页 > 其它

XSLT分页显示XML数据并对所有数据重新排序

2007-09-28 08:52 746 查看
关于XSLT及XML的介绍就不再多说,这里关注的是如何使用XSLT分页显示XML中的数据,并可以针对每一列对全部数据进行重新排序.

假设有下面的XML数据,需要使用XSLT分页显示XML数据,并可针对每一列对所有数据进行重新排序,应该如何处理呢?

XML数据如下:

1 <?xml version="1.0" encoding="gb2312"?>

2 <AllUsers xmlns:dt="urn:schemas-microsoft-com:datatypes">

3 <User>

4 <UserID>01</UserID>

5 <UserName>OhYeah</UserName>

6 <UserEmail>Oh@126.com</UserEmail>

7 </User>

8 <User>

9 <UserID>02</UserID>

10 <UserName>杨过</UserName>

11 <UserEmail>yg@21.com</UserEmail>

12 </User>

13 <User>

14 <UserID>03</UserID>

15 <UserName>真宝玉</UserName>

16 <UserEmail>xyz@msn.com</UserEmail>

17 </User>

18 <User>

19 <UserID>04</UserID>

20 <UserName>天堂</UserName>

21 <UserEmail>tt@163.net</UserEmail>

22 </User>

23 <User>

24 <UserID>05</UserID>

25 <UserName>草原</UserName>

26 <UserEmail>yt@sina.com</UserEmail>

27 </User>

28 </AllUsers>

29
恐怕最容易想到的就是XSLT中的for-each元素.

<xsl:param name="PageNo">1</xsl:param>

<xsl:param name="FuncName">goPage</xsl:param>

<xsl:param name="Count">4</xsl:param>

<table width="800" border="0" cellspacing="2" cellpadding="2">

<tr>

<th><xsl:attribute name="onClick">sortBy('UserID')</xsl:attribute>RecordNo</th>

<th><xsl:attribute name="onClick">sortBy(' UserName')</xsl:attribute>FieldA</th>

<th><xsl:attribute name="onClick">sortBy(' UserEmail')</xsl:attribute>Name</th>

</tr>

<xsl:for-each select="RecordSet[(position() <= $PageNo*$Count) and (position() > (number($PageNo)-1)*$Count)]">

<xsl:sort select="UserID"/>

<tr>

<td><xsl:value-of select="'UserID'"/></td>

<td><xsl:value-of select=" UserName"/></td>

<td><xsl:value-of select=" UserEmail"/></td>

</tr>

</xsl:for-each>

</table>

页码数发生变化时,通过JavaScript指定for-each中的$PageNo变量.

重新排序时,通过JavaScript指定sort元素的select属性.

但这里就有一个问题:这里点击列名重新排序时,只是对当前页的数据进行了重新排序(原因是先用for-each取出的当前页的数据,然后才进行排序的),咱们本来的目标应该是对所有数据重新排序的.

解决这个问题的过程中,孟子E章曾经给我一篇他网站上的文章,解决了这个问题.但网页使用的是VBScript,并且不能正确运行.为此,浪费了不少时间(-_-!!!,太懒了,就希望借用成功的代码,遇到不正确的代码就不愿自己去看.).不过最终总算搞明白了.解决方案就是先用一个XSLT对所有数据重新排序后生成XML,再对重新排序后的XML进行分页操作.

用于对XML排序并生成XML的XSLT如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="Table">

<?xml version="1.0" encoding="iso-8859-1"?>

< AllUsers >

<xsl:for-each select="RecordSet">

<xsl:sort order="ascending" data-type="text" select="Name"/>

<User>

<UserID><xsl:value-of select="RecordNo" /></UserID>

<UserName><xsl:value-of select="FieldA" /></UserName>

<UserEmail><xsl:value-of select="Name" /></UserEmail>

</User>

</xsl:for-each>

</ AllUsers >

</xsl:template>

</xsl:stylesheet>

其实现在想想也没有什么困难的,只是当时却费了不少心思才搞定.就这些了.有时间把代码挂出来.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: