如果我们在一个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/1705/
本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/