最近使用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; }
|