xslt转换xml常用知识(2)

接上次的文章xslt转换xml常用知识(1),介绍xslt转换xml的基本知识.(备注一下:文章中一些符号别编辑器给替换掉了,

这个----10;是为了不被编辑器给替换掉,故意这样写的,实践上应该是回车的实体符合,不清楚的可以看看我博客里面

一篇关于xml实体符号的文章)
1)xsl:template,xsl:variable,xsl:output,xsl:apply-templates,xsl:with-param,xsl:value-of,xsl:for-each,xsl:sort,

xsl:if,xsl:choose,xsl:when,xsl:call-template等元素的应用。
2)在xml中选择遍历,文本的回车转换成<br/>等
如有兴趣大家可以先参看我前面一篇文章:http://www.cnblogs.com/jackhuclan/archive/2008/08/23/1274058.html
(备注一下:文章中一些符号别编辑器给替换掉了,所有你想学习一下,还是参考我上一篇文章,下载一下代码。)

一)文本的回车转换成<br/>

   < xsl:template    name ="dds" >
    
< xsl:param    name ="des" />
    
< xsl:choose >
      
< xsl:when    test ="contains($des,' ')" >
        
< xsl:value-of    select ="substring-before($des,'----10;')"     />
        
< br />
        
< xsl:call-template    name ="dds" >
          
< xsl:with-param  name ="des"  select ="substring-after($des,'----10;')"     />
        
</ xsl:call-template >
      
</ xsl:when >
      
< xsl:otherwise >
        
< xsl:value-of  select ="$des" />
      
</ xsl:otherwise >
    
</ xsl:choose >
  
</ xsl:template >

 

上面这段代码就相当于一个函数,<xsl:template   name="dds">,dds相当于函数名称,<xsl:param   name="des"/>,des参数名称
怎么调用的呢,和大家平时调用函数一样,在需要的地方,引入函数,设定参数。

< xsl:call-template  name ="dds" >
 
< xsl:with-param  name ="des"  select ="Row/Description" ></ xsl:with-param >
</ xsl:call-template >


二)xml中的元素遍历。
现在需求这样的(参考我的上一篇文章)。在页面左下侧显示一个JobDetail/Row下面的内容,右侧在显示其他的Row下面的内容。
(需求是这样要求的,不然就直接排序,然后xsl:for-each就出来了,很简单。可要求将这样,就当挑战一下基本知识)
并且显示要根据Row/DesciptionType的分类。那么怎么做呢?我的算法如下:
1)保存第一行Row/DesciptionType中的值为全局变量

 

< xsl:variable  name ="desciptionType"  select ="/Job/JobDetail/Row[1]/DesciptionType" />


2)输出该具有相同DesciptionType的所有行,显示在左下侧

< xsl:apply-templates  select ="JobDetail" >
  
< xsl:with-param  name ="des1"  select ="$desciptionType" ></ xsl:with-param >
</ xsl:apply-templates >

 

 

< xsl:template  match ="JobDetail" >
    
< xsl:param  name ="des1" ></ xsl:param >
    
< table  width ="100%"  border ="1"  cellpadding ="0"  cellspacing ="0"  bordercolorlight ="#FFFFFF"  bordercolordark ="#efefef" >
      
< tr >
        
< td  height ="27px"  style ="padding-left:8px" >
          
< h3  style ="color:#f9c011;padding-top:16px;" >
            
< xsl:value-of  select ="Row[DesciptionType=$des1]/strDesciptionType" />
          
</ h3 >
        
</ td >
      
</ tr >
      
< xsl:for-each  select ="Row[DesciptionType=$des1]"   >
          
< tr >
            
< td  height ="27px"  style ="padding-left:15px" >
              ■ 
< xsl:value-of  select ="ShortDescription" />
            
</ td >
          
</ tr >
      
</ xsl:for-each >
    
</ table >
    
< table  border ="0"  cellpadding ="0"  cellspacing ="0" >
      
< tr >
        
< td  height ="10" ></ td >
      
</ tr >
    
</ table >
  
</ xsl:template >

 

  2)然后对JobDetail/Row排序,然后再进行循环遍历,如果该行已经显示过则跳过,如果没有显示过则将该行的DesciptionType

赋值给前面定义的全局变量,然后调用模板显示(相当于一个函数)

< xsl:for-each  select ="JobDetail/Row" >
  
< xsl:sort  select ="DesciptionType"  data-type ="number"  order ="ascending" />
  
< xsl:if  test ="DesciptionType != $desciptionType" >
 
< xsl:variable  name ="desciptionType"  select ="DesciptionType" ></ xsl:variable >
 
< xsl:call-template  name ="jd" >
   
< xsl:with-param  name ="des1"  select ="$desciptionType" ></ xsl:with-param >
   
< xsl:with-param  name ="cnode"  select ="//JobDetail/Row" ></ xsl:with-param >
 
</ xsl:call-template >
  
</ xsl:if >
</ xsl:for-each >

 

 

< xsl:template  name ="jd" >
    
< xsl:param  name ="des1" ></ xsl:param >
    
< xsl:param  name ="cnode" ></ xsl:param >
    
< table  width ="100%"  border ="1"  cellpadding ="0"  cellspacing ="0"  bordercolorlight ="#FFFFFF"  bordercolordark ="#efefef" >
      
< tr >
        
< td  height ="27px"  style ="padding-left:8px" >
          
< h3  style ="color:#f9c011;padding-top:16px;" >
            
< xsl:value-of  select ="$cnode[DesciptionType=$des1]/strDesciptionType" />
          
</ h3 >
        
</ td >
      
</ tr >
      
< xsl:for-each  select ="$cnode[DesciptionType=$des1]"   >
        
< tr >
          
< td  height ="27px"  style ="padding-left:15px" >
            ■ 
< xsl:value-of  select ="ShortDescription" />
          
</ td >
        
</ tr >
      
</ xsl:for-each >
    
</ table >
    
< table  border ="0"  cellpadding ="0"  cellspacing ="0" >
      
< tr >
        
< td  height ="10" ></ td >
      
</ tr >
    
</ table >
  
</ xsl:template >

 

    这里面涉及xsl:template,xsl:variable,xsl:output,xsl:apply-templates,xsl:with-param,xsl:value-of,xsl:for-each,xsl:sort,xsl:if,xsl:choose,xsl:when,xsl:call-template等元素的应用。这里简单说明一下,详解可以参考msdn
xsl:variable 定义全局变量
xsl:template 输出模板
xsl:apply-templates 应用模板,对某个节点应用什么模板,如:<xsl:apply-templates select="JobBase"></xsl:apply-templates>,注意select为节点名
xsl:call-template  调用模板,可以用函数的观念来理解就好理解了。和xsl:apply-templates还是有区别的,仔细看看我的文章将明白了
xsl:for-each,xsl:sort 前面是循环,后面是排序
xsl:if,xsl:choose,xsl:when 用于条件选择语句
xsl:output 定义xml的输出方式,有xml,html 如:<xsl:output method="xml" indent="yes"/>

转载于:https://www.cnblogs.com/jackhuclan/archive/2008/08/25/1275620.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值