以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 XML基础 』  (http://bbs.xml.org.cn/list.asp?boardid=1)
----  关于XML分页的解决方案。  (http://bbs.xml.org.cn/dispbbs.asp?boardid=1&rootid=&id=376)


--  作者:小鞋子
--  发布时间:12/30/2003 10:50:00 PM

--  关于XML分页的解决方案。
大家有什么好的办法吗。如果用数据岛的话是不错。但每次都要先LOAD那个XML文件再显示出来。如果数据一多真的不敢设想。
看来只能在服务器端处理过才行。大家有没有什么好的解决办法呢。
--  作者:faly
--  发布时间:12/31/2003 5:02:00 AM

--  
http://faly.nease.net/collection/codes/1.xml
http://faly.nease.net/collection/codes/1.xsl
这个是偶在csdn上发现的,整理了一下
--  作者:szn
--  发布时间:12/31/2003 9:43:00 AM

--  
有错误!
--  作者:chyni
--  发布时间:1/2/2004 10:18:00 PM

--  
感觉还是一次都把数据取出来了,数据多了就不行。
--  作者:faly
--  发布时间:1/9/2004 8:51:00 AM

--  
数据多了,一般还是用其它如*.mdb储存,用xml提取部分数据
--  作者:guoyan1981
--  发布时间:1/9/2004 11:53:00 AM

--  
XML卷之实战锦囊(3):动态分页[转帖]

xml卷之实战锦囊(3):动态分页
--sailflying

动机:为了方便用户查看大批量数据,我们会用到动态分页,因此分页功能是我们在网站上见过的最普遍也是最常用的一个功能模块了。而以往的信息分页都是连接到数据库的,每一次点击都必须要后台数据库的支持。这样不但服务器的负担加重,而且严重的影响用户浏览的速度.
试想,如果把分页的功能放到客户端,那会产生什么样的效果呢?呵呵,看看下面的设计吧! 。
材料:
xml卷之动态分页
有2个文件:pages.xml 和 pages.xsl
作用:把分页的功能放到客户端。在不刷新页面的情况下对数据进行过滤筛选,有效的提高浏览数据功能的效率。
效果:
浏览这里
代码:
pages.xml<?xml version="1.0" encoding="gb2312" ?>
<?xml-stylesheet type="text/xsl" href="pages.xsl" ?>
<blueidea>
<team>
<blue_id>1</blue_id>
<blue_name>sailflying</blue_name>
<blue_text>一个简单的分页</blue_text>
<blue_time>2002-1-11 17:35:33</blue_time>
<blue_class>xml专题</blue_class>
</team>
<team>
<blue_id>2</blue_id>
<blue_name>flyingbird</blue_name>
<blue_text>嫁给你,是要你疼的</blue_text>
<blue_time>2001-09-06 12:45:51</blue_time>
<blue_class>灌水精华</blue_class>
</team>
<team>
<blue_id>3</blue_id>
<blue_name>苛子</blue_name>
<blue_text>正则表达式在ubb论坛中的应用</blue_text>
<blue_time>2001-11-23 21:02:16</blue_time>
<blue_class>web 编程精华</blue_class>
</team>
<team>
<blue_id>4</blue_id>
<blue_name>太乙郎</blue_name>
<blue_text>年末经典分舵聚会完全手册 v0.1</blue_text>
<blue_time>2000-12-08 10:22:48</blue_time>
<blue_class>论坛灌水区</blue_class>
</team>
<team>
<blue_id>5</blue_id>
<blue_name>mmkk</blue_name>
<blue_text>asp错误信息总汇</blue_text>
<blue_time>2001-10-13 16:39:05</blue_time>
<blue_class>javascript脚本</blue_class>
</team>
</blueidea>


pages.xsl
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/tr/wd-xsl";>
<xsl:template match="/">
<html>
<head>
<title> xml卷之实战锦囊(3):动态分页</title>
<style>
body,blueidea,team,blue_id,blue_name,blue_text,blue_time,blue_class{ font: 12px "宋体", "arial", "times new roman"; }
table { font-size: 12px; border: 0px double; border-color: #99cc99 #99cc99 #cccccc #cccccc; cellpadding:3;cellspacing:3; bgcolor:#eeeeee; text-decoration: blink}
span { font-size: 12px; color: red; }
.keybutton { cursor:hand; font-size: 12px; color: #003300; background: #ffffff; border: 0px solid;}
</style>
<script>
<xsl:comment>
<![cdata[
var onepagenum=2;
var pagenum=1;
var xmlpagenum=1;function pages(num)
{
stylesheet=document.xsldocument;
source=document.xmldocument;
nodes=source.documentelement.childnodes;
len=nodes.length;
for(i=1;i<=(len/onepagenum);i++);
xmlpagenum=i;
var firstnum=0;
var lastnume=0;

if (num=="first") {pagenum=1;}
if (num=="previous") {if (pagenum>1) pagenum -=1;}
if (num=="next") {if (pagenum<xmlpagenum) pagenum +=1;}
if (num=="last") {pagenum =xmlpagenum;}

sortfield=document.xsldocument.selectsinglenode("//@expr");
firstnum=onepagenum*(pagenum-1)+1;
lastnum=onepagenum*(pagenum-1)+onepagenum;
text="childnumber(this)>="+firstnum+" & childnumber(this)<="+lastnum;
sortfield.value=text;
layer1.innerhtml=source.documentelement.transformnode(stylesheet);
}
]]>
</xsl:comment>
</script>
</head>
<body>
<p align="center"><span>xml卷之实战锦囊(3):动态分页</span></p>
<table align="center" width="500" >
<tr>
<td>
<button id="cmdfirstpage" class="keybutton" onclick="pages(''first'');" >首页</button>
<button id="cmdpreviouspage" class="keybutton" onclick="pages(''previous'');" >上一页</button>
<button id="cmdnextpage" class="keybutton" onclick="pages(''next'');">下一页</button>
<button id="cmdlastpage" class="keybutton" onclick="pages(''last'');">尾页</button>
</td>
</tr>
</table>
<div id="layer1" name="layer1"> <xsl:apply-templates select="blueidea" /></div>
</body></html>
</xsl:template>
<xsl:template match="blueidea">
<table width="500" border="1" align="center" cellpadding="1" cellspacing="1" bordercolordark="#ffffff" bordercolorlight="#adaaad">
<tr bgcolor="#ffcc99" align="center">
<td>编号</td>
<td>姓名</td>
<td>主题</td>
<td>发表时间</td>
<td>归类</td>
</tr>
<xsl:apply-templates select="team" order-by="blue_id"/>
</table>
</xsl:template>
<xsl:template match="team">
<xsl:if expr="childnumber(this)>=1 & childnumber(this)<=2 ">
<tr align="center">
<xsl:apply-templates select="blue_id" />
<xsl:apply-templates select="blue_name" />
<xsl:apply-templates select="blue_text" />
<xsl:apply-templates select="blue_time" />
<xsl:apply-templates select="blue_class" />
</tr>
</xsl:if>
</xsl:template>
<xsl:template match="blue_id">
<td bgcolor="#eeeeee">
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_name">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_text">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_time">
<td>
<xsl:value-of />
</td>
</xsl:template>
<xsl:template match="blue_class">
<td>
<xsl:value-of />
</td>
</xsl:template>
</xsl:stylesheet>

讲解:1)search.xml 是数据文件,相信大家都不会有问题。
2)search.xsl 是格式文件,有几个地方要注意。(1)脚本中:

nodes=source.documentelement.childnodes;
作用是:找到所有的节点。nodes.length就是符合条件的总节点数sortfield=document.xsldocument.selectsinglenode("//@expr");
作用是:找到有属性为expr的第一个节点,因此它对应的节点就是
<xsl:if expr="childnumber(this)>=1 & childnumber(this)<=2 ">
因此在初次onload的时候expr的value值是
childnumber(this)<=1 & childnumber(this)>=2
关于 > < 大家可能熟悉多了。那&是什么呢? 它就是“与”了.
大家可以在xml的书中找到其它的一些。

参数说明:
onepagenum:每页显示的数据数
pagenum:当前页数
xmlpagenum:总页数
firstnum:当前页的第一条数据值
lastnum:当前页的最后一条数据值
(2)文本中:

<xsl:if expr="childnumber(this)>=1 & childnumber(this)<=2 ">
在分页中我们需要输出合适的数据,,因此我们用一个 if 判断条件来控制。
在初始的时候我们要求只输出最前的两个节点的数值。

childnumber(this)
作用:返回当前节点在它的上级节点列表中的编号,列表中的第一个节点默认编号为1。
在分页中我们就是根据节点的编号来判断它属于第几页。
expr
不知道大家发现没有,前两次我们用到的都是 test ,可这个我们用的却是expr。
它们之间有一定的区别,用法也不相同。
expr ── 脚本语言表达式,计算结果为"真"或"假";如果结果为"真",且通过test,则在输出中显示其中内容(可省略此项属性)。
test ── 源数据测试条件。

<button id="cmdfirstpage" class="keybutton" onclick="pages(''first'');" >首页</button>
作用是让数据回到最前一页。其它按钮的作用类似。

补充一点: xml例子文件的使用方法1)将每个例子里的两个文件按照文件名分别保存。
2)用浏览器浏览xml文件即可。这是你会看到效果,应该不错吧!

后记:
呵呵,可以增加动态排序后,再分页的功能。再把列表数变为可设置。发挥你的思维,让这些功能更加完美。大家可以研究出更好的方法来实现分页功能。互相探讨,不亦乐乎!


查看例子

[URL=http://www.wy1997.com/sailflying/learn/pages.xml]查看例子[/URL]

[此贴子已经被作者于2004-1-9 11:54:56编辑过]

--  作者:faly
--  发布时间:2/1/2004 12:04:00 AM

--  
以下是引用chyni在2004-1-2 22:18:26的发言:
感觉还是一次都把数据取出来了,数据多了就不行。


我看武汉热线上的人才频道是aspx
速度好慢
就是数据多了,又不可以一次全取出,每翻页一次就要重新读取全部数据
所以速度很慢
可以看一下注册后登陆进入职位列表
http://jobs.wuhan.net.cn/
--  作者:gs412
--  发布时间:5/12/2004 11:46:00 AM

--  
[b]
--  作者:孤独
--  发布时间:5/12/2004 1:11:00 PM

--  
http://bbs.xml.org.cn/dispbbs.asp?boardID=8&ID=7415
--  作者:ljy118
--  发布时间:5/31/2004 10:11:00 AM

--  

--  作者:孤独
--  发布时间:5/31/2004 8:33:00 PM

--  
我认为列表还是从数据库:)
--  作者:小鞋子
--  发布时间:6/2/2004 9:34:00 AM

--  
嗯.我想XML.不一定要全生成XML文件的.可以作为动态生成
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
93.750ms