如果我们在一个Xml中有N个子结点,我们希望取得其中的指定位置的节点,我们应该怎么做呢?我们有三种方法可以实现这个功能。
Xml如下:
<?xml version="1.0" encoding="UTF-8"?> <Items> <Item Name="001"/> <Item Name="002"/> ... <Items>
第一种方法,也是最笨的一种,采用结合position()函数及循环的方式,这种方法优点处是代码量较小,缺点是如果有1000个节点,就需要循环1000次,核心代码如下:
<?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!---取Items下大于1前小于3的节点--> <xsl:for-each select="Items/*"> <!--用position()进行判断当前节点是否要取的范围--> <xsl:if test="position() > 1 and position() < 6"> <xsl:value-of select="@Name" /><br /> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>
第二种方法是用递归,优缺点与第一种相反,核心代码如下:
<?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!---定义结束的结束--> <xsl:variable name="End">5</xsl:variable> <xsl:template match="/"> <xsl:call-template name="ShowItem"> <xsl:with-param name="LoopIndex">1</xsl:with-param> </xsl:call-template> </xsl:template> <xsl:template name="ShowItem"> <xsl:param name="LoopIndex" /> <xsl:value-of select="Items/Item[$LoopIndex]/@Name" /><br /> <!--如果节点索引小于终止节点,就递归调用,并将LoopIndex加1--> <xsl:if test="$LoopIndex < $End"> <xsl:call-template name="ShowItem"> <xsl:with-param name="LoopIndex" select="$LoopIndex + 1" /> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>
第三种方法也是最好的一种,兼有前两种方法的优点,代码量最小,也不用多次循环,主要是在select 中使用了XPath,核心代码如下:
<?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <!---采用XPath取大于1前小于3的节点--> <xsl:for-each select="Items/Item[position() > 1 and position() < 6]"> <xsl:value-of select="@Name" /><br /> </xsl:for-each> </xsl:template> </xsl:stylesheet>
本文来自涂雅[http://iove.net/],原文链接:http://iove.net/archives/732.html,网站转载请注明来源于涂雅并保留原文链接,否则视为侵权。
嗯,或者你也可以收听我的微博,腾讯微博(主要用这个,其他的看我的个人介绍)
我写博客常常出现错别字,常常错得还很离谱,有时候我自己看了第二遍都骂我自个儿,但我又不习惯重复审查,纠结啊...各位看到啥错别字或者不明白的地方,请给我留言指出来,感谢感谢。
gmail.com
最新评论