使用xsl筛选记录

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 dandantree 的 blog

最近使用xml dataisland配合javascript 将标准的html表格table扩展成了一个类似windows下的msflexgrid一样的具有丰富客户端行为的网格,在更新数据时,为了减少提交上传的xml文件的大小,便将原先绑定的数据集添加了一个标记节点<recordflag>,值只有三种new,update,del,分别用来表示其父节点是新增的,还是修改过的,或者是删除过的,并且在通过xmlhttp上传之前,将所有添加了<recordflag>的纪录筛选出来。在处理这个筛选的过程中,我先使用了javascript模拟了一个筛选算法,但是在数据岛数据很大时,筛选就很慢,于是左思右想,配合高人指点,使用xsl来处理了这个数据岛,用很快的速度就实现了大量数据的筛选过程。
我的xml结构是这样的
&lt;root&gt;
&lt;record&gt;
&lt;field1&gt;...&lt;/field1&gt;
&lt;field2&gt;...&lt;/field2&gt;
&lt;field3&gt;...&lt;/field3&gt;
...
&lt;fieldn&gt;...&lt;/fieldn&gt;
&lt;record&gt;
...
&lt;record&gt;
&lt;field1&gt;...&lt;/field1&gt;
&lt;field2&gt;...&lt;/field2&gt;
&lt;field3&gt;...&lt;/field3&gt;
...
&lt;fieldn&gt;...&lt;/fieldn&gt;
&lt;recordflag&gt;...&lt;/recordflag&gt;
&lt;!--做了手脚的纪录节点--&gt;
&lt;record&gt;
...
&lt;/root&gt;
xsl文件如下,名称为“select.xsl“:
&lt;?xml version="1.0"?&gt;
&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"&gt;
&lt;xsl:output method = "xml"  omit-xml-declaration = "yes" indent = "yes"/&gt;
&lt;xsl:template match="node()"&gt;
&lt;xsl:copy&gt;
&lt;xsl:for-each select="..."&gt;
&lt;!--这里就是对应每个记录的节点名称,这里可以为record--&gt;
&lt;xsl:if test="recordflag"&gt;
&lt;!--这里就是要筛选出来的标记节点名称,就是recordflag--&gt;
&lt;xsl:copy-of select="."/&gt;
&lt;/xsl:if&gt;
&lt;/xsl:for-each&gt;
&lt;/xsl:copy&gt;
&lt;/xsl:template&gt;
&lt;/xsl:stylesheet&gt;
通过以下javascript实现了转换:
function getresultset()
{
      var recordset = document.getelementbyid(you island id)
      var xslselect = new activexobject('msxml2.domdocument');
      xslselect.async = false;
      xslselect.load('select.xsl');
      var resultset = new activexobject('msxml2.domdocument');
      resultset.loadxml(recordset.xml)
//由于island在浏览器端不支持transformnode()方法,所以得用一
//个msxml2dom来转换一下。
      resultset.loadxml(resultset.transformnode(resultset));
      return resultset;
}

本文关键:使用xsl筛选记录
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top