xsl 应用实例

 最近做追溯系统,需要展示的数据流来源是xml流,所以考虑使用xsl来转换成html来展示,由于第一次使用,遇到很多困难,上网查了很多资料后,总算是做的能看看了,下面把代码贴出来。

首先,xml文件

 

<? xml version="1.0" encoding="utf-8" standalone="yes" ?>
< 锅炉 >
  
< 生产制造 >
    
< 层次1 >
      
< 产品编号 > P0807-XC </ 产品编号 >
      
< 产品名称 > 燃油气锅炉 </ 产品名称 >
      
< 产品型号 > Model1-XC </ 产品型号 >
      
< 发卡日期 > 2008-2-26 15:12:47 </ 发卡日期 >
      
< 监检报告编号 > Report-XC-004 </ 监检报告编号 >
      
< 监检单位 > 山东省特检院-XC </ 监检单位 >
      
< 卡号 > 30d345e6c005978c </ 卡号 >
      
< 企业id > 1 </ 企业id >
      
< 设计图号 > D1 </ 设计图号 >
      
< 设计许可号 > J1 </ 设计许可号 >
      
< 是否发卡 > 1 </ 是否发卡 >
      
< 完成日期 > 2008-2-21 0:00:00 </ 完成日期 >
      
< 制造厂家 ></ 制造厂家 >
      
< 制造许可证编号 > M1 </ 制造许可证编号 >
      
< 质保书编号 > XC-007 </ 质保书编号 >
    
</ 层次1 >
  
</ 生产制造 >
</ 锅炉 >

 

上述为获得的xml的简单示例,其中各个节点名称都是动态的,所以在xsl中不能写死。

下面贴出还算过得去的xslt文件

 

<? xml version='1.0' ?>
< xsl:stylesheet  xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"  version ="1.0" >  

  
< xsl:template  match ="//*" >
    
< HTML >
      
< head >
      
</ head >
      
< BODY >
        
< FONT  face ="Verdana"  size ="2" >  

          
< TABLE  cellspacing ="0"  cellpadding ="0" >
            
< tr >
              
< td >  

                
< xsl:variable  name ="product"  select ="name()" />  

                
< xsl:for-each  select  ="./*" >
                  
< xsl:variable  name ="process"  select ="name()" />
                  
< xsl:for-each  select ="././*" >
                    
< xsl:variable  name ="record"  select ="name()" />
                    
< table    cellspacing ="0"  cellpadding ="0"  width ="600px"   bordercolorlight ="#6699FF"  bordercolordark ="#FFFFFF" >
                      
< TR  bgcolor ="#99ccff" >
                        
< td  class ="info"  Width ="200px" >
                          设备名称: 
< B >
                            
< xsl:value-of  select ="$product" />
                          
</ B >
                        
</ td >
                        
< td  Width ="200px" >
                          环节名称: 
< B >
                            
< xsl:value-of  select ="$process" />
                          
</ B >
                        
</ td >
                        
< td  Width ="200px" >
                          记录号: 
< B >
                            
< xsl:value-of  select ="$record" />
                          
</ B >
                        
</ td >
                      
</ TR >
                    
</ table >  

                    
< table  bgcolor ="#ccffcc"   cellspacing ="0"  cellpadding ="0"  width ="600px"   border ="1"  bordercolorlight ="#6699FF"  bordercolordark ="#FFFFFF"   >
                        
< xsl:for-each  select ="./././*" >
                          
< xsl:variable  name ="nname"  select ="name()" />
                              
< TR >
                                
< TD  class ="info"  Width ="200px" >
                                  
< xsl:value-of  select ="name()" /> :
                                
</ TD >
                                
< td  class ="info"  width ="400px" >
                                  
< B >
                                    
< xsl:value-of  select ="." />
                                    
< xsl:text  disable-output-escaping ="yes" > &amp; nbsp; </ xsl:text >
                                  
</ B >
                                
</ td >
                              
</ TR >
                        
</ xsl:for-each >
                      
</ table >
                  
</ xsl:for-each >  

                
</ xsl:for-each >  

              
</ td >
            
</ tr >
          
</ TABLE >
        
</ FONT >
      
</ BODY >
    
</ HTML >
  
</ xsl:template >
</ xsl:stylesheet >  

 

  <xsl:template match="//*">中的"//*"表示匹配xml文档的根节点下的所有节点,这里因为要获取根节点的名称,所以不能直接匹配"/"(全文档)

<xsl:variable name="product" select="name()"/>

定义了变量product 用于存放根节点名称。select="name()"只能用于取得当前匹配层的节点名称,这点需要注意。再者,variable变量只能定义一次值,不能改变其值,且作用域限于当前template。

<xsl:for-each select ="./*"> 循环操作 select指定循环的节点匹配。

select="./*" 表示循环下一层节点。./表示在template指定的层数下移一层,*表示所有节点。

其中指定select=value 时 value可有多种表达方式。可以指定为具体的节点名称,如 select = "生产制造“ 如果能够确定节点名称的话。

也可以加入判定条件,如 select = "./*[name()=生产制造" 或者 select="./*[name()=$product]" 这里$product是前面定义的变量。$变量名是使用变量的方法。

<xsl:value-of select="$record"/> 这里是输出该节点的内容,或者变量的值。 当你一层层扒开xml的外衣的时候,最终取得果实的就是他了。

<xsl:value-of select="nodeName"/> 表示输出接点名为nodeName的节点的ContentValue。当然也可以输出属性,属性用select="@属性名"来指定,但是这里的属性为当前层的节点的属性,如果在循环内部,即为循环的节点的属性。输出属性的时候也可以指定属性的层,如select = "*/@name"表示输出循环下每一层的name属性的值。

基本上现在掌握的也就这样吧,xslt还是很强大的,以后有机会慢慢学习吧。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值