当前位置:中国站长下载文章中心网页编程.NET编程 → 使用xsl筛选记录

使用xsl筛选记录

减小字体 增大字体 作者:不详  来源:不详  发布时间:2006-8-14 8:31:44
     最近使用xml DataIsland配合javascript 将标准的html表格TABLE扩展成了一个类似windows下的MSFlexGrid一样的具有丰富客户端行为的网格,在更新数据时,为了减少提交上传的xml文件的大小,便将原先绑定的数据集添加了一个标记节点<RecordFlag>,值只有三种NEW,UPDATE,DEL,分别用来表示其父节点是新增的,还是修改过的,或者是删除过的,并且在通过xmlhttp上传之前,将所有添加了<RecordFlag>的纪录筛选出来。在处理这个筛选的过程中,我先使用了javascript模拟了一个筛选算法,但是在数据岛数据很大时,筛选就很慢,于是左思右想,配合高人指点,使用xsl来处理了这个数据岛,用很快的速度就实现了大量数据的筛选过程。
  我的xml结构是这样的
  <root>
  <record>
  <field1>...</field1>
  <field2>...</field2>
  <field3>...</field3>
  ...
  <fieldn>...</fieldn>
  <record>
  ...
  <record>
  <field1>...</field1>
  <field2>...</field2>
  <field3>...</field3>
  ...
  <fieldn>...</fieldn>
  <RecordFlag>...</RecordFlag>
  <!--做了手脚的纪录节点-->
  <record>
  ...
  </root>
  xsl文件如下,名称为“select.xsl“:
  <?xml version="1.0"?>
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method = "xml" omit-xml-declaration = "yes" indent = "yes"/>
  <xsl:template match="node()">
  <xsl:copy>
  <xsl:for-each select="...">
  <!--这里就是对应每个记录的节点名称,这里可以为record-->
  <xsl:if test="RecordFlag">
  <!--这里就是要筛选出来的标记节点名称,就是RecordFlag-->
  <xsl:copy-of select="."/>
  </xsl:if>
  </xsl:for-each>
  </xsl:copy>
  </xsl:template>
  </xsl:stylesheet>
  通过以下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;
  }
  
  
    做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。