涂雅[博客园]
最新文章请访问独立博客:http://iove.net
  如果我们在一个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() &gt; 1 and position() &lt; 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 &lt; $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() &gt; 1 and position() &lt; 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/

posted on 2007-07-18 15:18  Conis  阅读(1033)  评论(0)    收藏  举报