|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
减少客户内IT专业人才缺乏带来的影响。ASP的客户员工利用浏览器进入相关的应用软件,简单易用,无需专业技术支持。数据排序及怎样静态排序
//Belltree
//http://www.lurer.net/
//初学XML,毛病的地方多多,各路妙手多多斧正
在<xsl:for-eachselect="//item"order-by="text()">及<xsl:apply-templatesselect="//item"/>中都能够看到
order-by属性,该属性能够对选出来的节点依照order-by的值举行排序.
<singer>
<title>ChristinaAguilera</title>
<songs>
<itemid="0"href="genieinabottle.christina.xml">Genieinabottle</item>
<itemid="1"href="whatagirlwants.christina.xml">Whatagirlwants</item>
<itemid="2"href="iturntoyou.christina.xml">Iturntoyou</item>
<itemid="5"href="soemotional.christina.xml">Soemotional</item>
<itemid="4"href="comeonover.christina.xml">Comeonover</item>
<itemid="3"href="reflection.christina.xml">Reflection</item>
<itemid="6"href="lovefor.christina.xml">Loveforallseasons</item>
<itemid="7"href="somebody.christina.xml">Somebodyssomebody</item>
<itemid="10"href="puturhands.christina.xml">Whenyouputyourhandsonme</item>
<itemid="9"href="blessed.christina.xml">Blessed</item>
<itemid="8"href="lovefindaway.christina.xml">Lovewillfindaway</item>
<itemid="11"href="obvious.christina.xml">obvious</item>
</songs>
</singer>
在这个例子中,假如我们必要一个依照歌名举行排序的列表,可使用以下XSL:
<xsl:for-eachselect="//item"order-by="text()">
<a><xsl:attributename="href"><xsl:value-ofselect="@href"/></xsl:attribute><xsl:value-of/></a>
<br/>
</xsl:for-each>
如许就依照每一个item节点的值举行了排序,还可使用id属性来排序,只需将order-by="text()"改成oder-by="@id"便可.
但假如我们必要让用户本人选择怎样排序,乃至是不排序,即依照原始按次.
这时候就该让script和XMLDOM上场了,在DOM中,有一系列的Methods和Attributes让你设置,你能够从头天生一棵树,我们便可
以使用这些东东将order-by属性的值改失落,然后再从头使用这个XSL节点对你必要的节点数据从头天生一棵树,这棵树是排序
了的,注重,order-by的值可不是本来的了,是你的新值.你乃至能够将order-by属性从XSL节点属性中往失落,如许天生的树就
是依照原始按次了.
看看响应的XMLDOMMethods:
selectSingleNode前往单个节点
setAttribute设置属性值,假如属性不存在,创立它并设置值
removeAttribute移往属性
transformNode利用响应的XSLstylesheet对该节点及其字节点举行处置后,前往一个了局树
最入手下手,我们要将XSL中的xsl:for-each节点选出来,并将它付与一个变量s,好对它举行处置:
vars=document.XSLDocument.selectSingleNode("//xsl:for-each")
然后,对它的属性order-by的值重新设置:
setAttribute("order-by",key);//key为一个变量,能够为id,text()
大概,将其删往:
removeAttribute("order-by");
哈哈,很复杂吧
我们如今来看看源树中必要排序的部分,是singer/songs节点中的每一个item节点,不必要选择全部树,只需singer/songs便可
以了
varxmldoc=document.XMLDocument.selectSingleNode("singer/songs");
将全部XSL树使用该节点:
divItems.innerHTML=xmldoc.transformNode(document.XSLDocument);//毛病来了
是否是要对这个节点使用全部XSL树呢?固然不用,如许也会带来毛病,应为了局必需显现在某个中央,我们转头来看一看:
<xsl:templatematch="/">
<divid="divItems">
<divid="in">
<xsl:for-eachselect="//item"order-by="id">
<a><xsl:attributename="href"><xsl:value-ofselect="@href"/></xsl:attribute><xsl:value-of/></a>
<br/>
</xsl:for-each>
</div>
</div>
</xsl:template>
我们在<xsl:for-each>的用<div>容器包住,为何要用两个<div>呢,这个前面申明,先来看看transformNode,使用全部XSL
树会带来甚么成果,如许又会从头天生一个<divid="divItems">...</div>,就会招致两个同id的div,了局是没法运转.
我们只必要选<divid="in">这个节点就够了.
varxsldoc=document.XSLDocument.selectSingleNode("//div[@id=in]");
然后将xsldoc使用到xmldoc上就成了
divItems.innerHTML=xmldoc.transformNode(xsldoc);
两个div仍是有效的吧,第一个是一个显现了局的容器,第二个每次都包括在了局树中,假如没有<divid="in">间接选<div
id="divItems">就会呈现和使用全部XSL树一样的毛病.
最初,仍是看看完全的:(详细效果请看http://go8.163.com/~belltree/test.xml)
XML:
<?xmlversion="1.0"?>
<?xml-stylesheettype="text/xsl"href="test.xsl"?>
<singer>
<title>ChristinaAguilera</title>
<songs>
<itemid="0"href="genieinabottle.christina.xml">Genieinabottle</item>
<itemid="1"href="whatagirlwants.christina.xml">Whatagirlwants</item>
<itemid="2"href="iturntoyou.christina.xml">Iturntoyou</item>
<itemid="3"href="soemotional.christina.xml">Soemotional</item>
<itemid="4"href="comeonover.christina.xml">Comeonover</item>
<itemid="5"href="reflection.christina.xml">Reflection</item>
<itemid="6"href="lovefor.christina.xml">Loveforallseasons</item>
<itemid="7"href="somebody.christina.xml">Somebodyssomebody</item>
<itemid="8"href="puturhands.christina.xml">Whenyouputyourhandsonme</item>
<itemid="9"href="blessed.christina.xml">Blessed</item>
<itemid="10"href="lovefindaway.christina.xml">Lovewillfindaway</item>
<itemid="11"href="obvious.christina.xml">obvious</item>
</songs>
</singer>
XSL:
<?xmlversion="1.0"encoding="gb2312"?>
<xsl:stylesheetxmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:templatematch="/">
<html>
<scriptlanguage="javascript">
<xsl:comment>
functionsort(key){
//Findthe"for-each"attributesinthestylesheet.
vars=document.XSLDocument.selectSingleNode("//xsl:for-each");
if(key=="")
s.removeAttribute("order-by");
else
s.setAttribute("order-by",key);
//Findthesubsetofthedocumentweneedtoupdate.
varxmldoc=document.XMLDocument.selectSingleNode("singer/songs");
varxsldoc=document.XSLDocument.selectSingleNode("//div[@id=in]");
//Applythestylesheettothesubset,andupdatethedisplay.
divItems.innerHTML=xmldoc.transformNode(xsldoc);
}
</xsl:comment>
</script>
<body>
<tableborder="1"cellspacing="0"cellpadding="1">
<tr><td>
<divid="divItems">
<divid="in">
<xsl:for-eachselect="//item"order-by="@id">
<a><xsl:attributename="href"><xsl:value-ofselect="@href"/></xsl:attribute><xsl:value-of/></a>
<br/>
</xsl:for-each>
</div>
</div>
</td><td>
<inputtype="button"value="Text"/>
<inputtype="button"value="@id"/>
<inputtype="button"value="Origin"/>
</td></tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
大家可以自己去看一看.可以说看得想呕吐.以前有次下了个动网来看.里面连基本内置函数的保护措施(函数没防御性)都没有.难怪经常补这个补那个了.可能现在.NET版会好点吧 |
|