博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
xslt中的for-each排序
阅读量:6290 次
发布时间:2019-06-22

本文共 3875 字,大约阅读时间需要 12 分钟。

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

  例如我们有这样一个xml文本:

<?
xml version="1.0" encoding="utf-8"
?>
<
Users
>
  
<
User
>
    
<
Name
>
Jaxu
</
Name
>
    
<
ID
>
1
</
ID
>
    
<
Professional
>
.NET,PHP Design
</
Professional
>
  
</
User
>
  
<
User
>
    
<
Name
>
Bruce
</
Name
>
    
<
ID
>
2
</
ID
>
    
<
Professional
>
Project Manager
</
Professional
>
  
</
User
>
  
<
User
>
    
<
Name
>
Tony
</
Name
>
    
<
ID
>
3
</
ID
>
    
<
Professional
>
Developer
</
Professional
>
  
</
User
>
  
<
User
>
    
<
Name
>
John
</
Name
>
    
<
ID
>
4
</
ID
>
    
<
Professional
>
Dev lead
</
Professional
>
  
</
User
>
  
<
User
>
    
<
Name
>
Eric
</
Name
>
    
<
ID
>
5
</
ID
>
    
<
Professional
>
Tester
</
Professional
>
  
</
User
>
  
<
User
>
    
<
Name
>
Owen
</
Name
>
    
<
ID
>
6
</
ID
>
    
<
Professional
>
Designer
</
Professional
>
  
</
User
>
  
<
User
>
    
<
Name
>
Bruce
</
Name
>
    
<
ID
>
7
</
ID
>
    
<
Professional
>
Project Manager
</
Professional
>
  
</
User
>
</
Users
>

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

<?
xml version="1.0" encoding="utf-8"
?>
<
xsl:stylesheet 
version
="1.0"
 xmlns:xsl
="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl
="urn:schemas-microsoft-com:xslt"
 exclude-result-prefixes
="msxsl"
>
  
<
xsl:output 
method
="html"
 indent
="yes"
/>
  
<
xsl:template 
match
="*"
>
    
<
table 
border
="1"
 cellpadding
="2"
 cellspacing
="4"
 width
="100%"
>
      
<
xsl:for-each 
select
="//User"
>
        
<
xsl:sort 
select
="Name"
 order
="ascending"
/>
        
<
xsl:sort 
select
="ID"
 order
="descending"
/>
        
<
tr
>
          
<
td
>
            
<
div
>
              ID: 
<
xsl:value-of 
select
="ID"
/>
            
</
div
>
            
<
div
>
              Name: 
<
xsl:value-of 
select
="Name"
/>
            
</
div
>
            
<
div
>
              Professional: 
<
xsl:value-of 
select
="Professional"
/>
            
</
div
>
          
</
td
>
        
</
tr
>
      
</
xsl:for-each
>
    
</
table
>
  
</
xsl:template
>
</
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()函数的位置来定位节点。

<?
xml version="1.0" encoding="utf-8"
?>
<
xsl:stylesheet 
version
="1.0"
 xmlns:xsl
="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl
="urn:schemas-microsoft-com:xslt"
 exclude-result-prefixes
="msxsl"
>
  
<
xsl:output 
method
="html"
 indent
="yes"
/>
  
<
xsl:template 
match
="*"
>
    
<
table 
border
="1"
 cellpadding
="2"
 cellspacing
="4"
 width
="100%"
>
      
<
xsl:variable 
name
="countUser"
 select
="count(//User)"
 
/>
      
<
xsl:for-each 
select
="//User"
>
        
<
xsl:variable 
name
="pos"
 select
="position()"
/>
        
<
tr
>
          
<
td
>
            
<
div
>
              ID: 
<
xsl:value-of 
select
="../User[position() = $countUser - $pos + 1]/ID"
/>
            
</
div
>
            
<
div
>
              Name: 
<
xsl:value-of 
select
="../User[position() = $countUser - $pos + 1]/Name"
/>
            
</
div
>
            
<
div
>
              Professional: 
<
xsl:value-of 
select
="../User[position() = $countUser - $pos + 1]/Professional"
/>
            
</
div
>
          
</
td
>
        
</
tr
>
      
</
xsl:for-each
>
    
</
table
>
  
</
xsl:template
>
</
xsl:stylesheet
>

 

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

本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/archive/2010/04/01/1702075.html,如需转载请自行联系原作者

你可能感兴趣的文章
颜色空间系列4: RGB和YDbDr颜色空间的转换及优化算法
查看>>
Unity C# 设计模式(七)适配器模式
查看>>
Lancel sac négociation avec insistance que nous pourrions réaliser de quelle route
查看>>
空白表单提交到后台的数据类型总结(java)
查看>>
Vue问题区
查看>>
[原]Unity3D深入浅出 - Shader基础开发
查看>>
netty之ByteBuf详解
查看>>
数据泵导出oracle 10g数据库
查看>>
LYSE-模块
查看>>
Date Picker和UITool Bar控件简单介绍
查看>>
sql server 实现多表连接查询
查看>>
HTTP 1.1与HTTP 1.0的比较
查看>>
如何在命令行脚本中启动带参数的Windows服务
查看>>
abstract vs interface
查看>>
nodejs笔记1 ----关于express不是本地命令
查看>>
python debug
查看>>
docker-machine 远程安装docker
查看>>
最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
查看>>
3.2 进程间通信之fifo
查看>>
WEB 开发前传——js笔记
查看>>