xsl 应用实例

来源:互联网 发布:mac上的开发工具 编辑:程序博客网 时间:2024/06/11 10:50
 最近做追溯系统,需要展示的数据流来源是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还是很强大的,以后有机会慢慢学习吧。 

原创粉丝点击