热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> XML编程>>正文内容

xslt中的for-each排序

发布时间:2010年04月04日点击数: 佚名

 众所周知,我们可以使用xslt对xml数据进行格式化输出,xslt中有一种for-each标记可以实现对xml中重复标记的循环遍历,如果你对xslt还不太了解,可以去W3school网站上了解下。使用for-each标记可以非常方便地实现节点的遍历,而且在遍历的同时还可以对节点进行排序。
  例如我们有这样一个xml文本:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <Users> 
  3.   <User> 
  4.     <Name>Jaxu</Name> 
  5.     <ID>1</ID> 
  6.     <Professional>.NET,PHP Design</Professional> 
  7.   </User> 
  8.   <User> 
  9.     <Name>Bruce</Name> 
  10.     <ID>2</ID> 
  11.     <Professional>Project Manager</Professional> 
  12.   </User> 
  13.   <User> 
  14.     <Name>Tony</Name> 
  15.     <ID>3</ID> 
  16.     <Professional>Developer</Professional> 
  17.   </User> 
  18.   <User> 
  19.     <Name>John</Name> 
  20.     <ID>4</ID> 
  21.     <Professional>Dev lead</Professional> 
  22.   </User> 
  23.   <User> 
  24.     <Name>Eric</Name> 
  25.     <ID>5</ID> 
  26.     <Professional>Tester</Professional> 
  27.   </User> 
  28.   <User> 
  29.     <Name>Owen</Name> 
  30.     <ID>6</ID> 
  31.     <Professional>Designer</Professional> 
  32.   </User> 
  33.   <User> 
  34.     <Name>Bruce</Name> 
  35.     <ID>7</ID> 
  36.     <Professional>Project Manager</Professional> 
  37.   </User> 
  38. </Users> 

按照Name升序,ID降序进行排序输出,下面是对应的xslt代码:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  3.     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
  4. > 
  5.   <xsl:output method="html" indent="yes"/> 
  6.  
  7.   <xsl:template match="*"> 
  8.     <table border="1" cellpadding="2" cellspacing="4" width="100%"> 
  9.       <xsl:for-each select="//User"> 
  10.         <xsl:sort select="Name" order="ascending"/> 
  11.         <xsl:sort select="ID" order="descending"/> 
  12.         <tr> 
  13.           <td> 
  14.             <div> 
  15.               ID: <xsl:value-of select="ID"/> 
  16.             </div> 
  17.             <div> 
  18.               Name: <xsl:value-of select="Name"/> 
  19.             </div> 
  20.             <div> 
  21.               Professional: <xsl:value-of select="Professional"/> 
  22.             </div> 
  23.           </td> 
  24.         </tr> 
  25.       </xsl:for-each> 
  26.     </table> 
  27.  
  28.   </xsl:template> 
  29. </xsl:stylesheet> 

 下面是输出的结果:

 

ID: 7
Name: Bruce
Professional: Project Manager
ID: 2
Name: Bruce
Professional: Project Manager
ID: 5
Name: Eric
Professional: Tester
ID: 1
Name: Jaxu
Professional: .NET,PHP Design
ID: 4
Name: John
Professional: Dev lead
ID: 6
Name: Owen
Professional: Designer
ID: 3
Name: Tony
Professional: Developer

xsl:sort语句可以对于用xsl:for-each或xsl:apply-templates匹配的节点进行排序,xsl:sort语句必须写在它所应用的标记的第一行(之前不允许有其它任何标记),如:
按大小写排序
  <xsl:sort case-order="upper-first" select="@id"/> 以id为关键字按大写优先排序
  <xsl:sort case-order="lower-first" select="@id"/> 以id为关键字按小写优先排序
按字母顺序排序
  <xsl:sort order="ascending" select="@id "/> 以id为关键字按字母升序排序
  <xsl:sort order="descending" select="@id "/> 以id为关键字按字母降序排序
按数据类型排序
  <xsl:sort data-type="text" select="@id"/> 以id为关键字按文本类型排序,如对于一组id数据101,2,44,305 来说,排序结果是101,2,305,44
  <xsl:sort data-type="number" select="@id"/> 以id为关键字按数据类型排序,上面一组数据的排序结果是2,44,101,305

  另外,我们还可以在for-each语句中使用position()函数实现节点的位置排序,如<xsl:sort select="position()" order="descending"/>。这里还有一种方法可以实现节点的位置倒序排序,没有使用xsl:sort语句,完全按照position()函数的位置来定位节点。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  3.     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
  4. > 
  5.   <xsl:output method="html" indent="yes"/> 
  6.  
  7.   <xsl:template match="*"> 
  8.     <table border="1" cellpadding="2" cellspacing="4" width="100%"> 
  9.       <xsl:variable name="countUser" select="count(//User)" /> 
  10.       <xsl:for-each select="//User"> 
  11.         <xsl:variable name="pos" select="position()"/> 
  12.         <tr> 
  13.           <td> 
  14.             <div> 
  15.               ID: <xsl:value-of select="../User[position() = $countUser - $pos + 1]/ID"/> 
  16.             </div> 
  17.             <div> 
  18.               Name: <xsl:value-of select="../User[position() = $countUser - $pos + 1]/Name"/> 
  19.             </div> 
  20.             <div> 
  21.               Professional: <xsl:value-of select="../User[position() = $countUser - $pos + 1]/Professional"/> 
  22.             </div> 
  23.           </td> 
  24.         </tr> 
  25.       </xsl:for-each> 
  26.     </table> 
  27.   </xsl:template> 
  28. </xsl:stylesheet> 

 xslt在编写方面还有很多的技巧,需要我们在使用的过程中不断去发现,而且最新的xslt 2.0标准中还增加了很多新的属性和标记,今后我们就可以使用xslt编写出更多逻辑复杂的代码了

本站热点业务

更多模板/案例展示

热门推荐

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作