XML与XSLT

原创 2007年10月15日 19:43:00

        之前有谈过XML与CSS的搭配,可以让用户拥有多种数据显示样式。但这种搭配亦有不足之处,首先 编写者必须了解和掌握XML和CSS两种语法规则,无形中增加了编写者的知识成本;其次,编写者无法对数据进行查询性的显示,即通过XML与CSS的搭配只能将所有数据全部显示出来,无法实现只显示符合某种条件的数据。

       为了降低编写者的知识成本,W3C组织又在XML文件基础之上定义了新的样式文件 -- XSLT(eXtended Stylesheet Language Transformation)。它遵循XML语法要求,编写者只要会写XML文件,就能够写出简单的XSLT文件。

<?xml version=”1.0” encoding=”GB2312”?>
<xsl:stylesheet version=”1.0” xmlns:xsl=”http:/www.3w.org/1999/XSL/Transform”>
  
<!-- Formatting commands for this document as a whole -->
</xsl:stylesheet>

       XSLT样式文件使用模板(Template)系统来匹配XML文件中的内容,并规定如何处理它们。一旦某个模板匹配上了XML中的一个元素,就会将模板内容应用到该元素上。使用xsl:value-of可以查询出XML中指定结点的值,使用xsl:for-each,xsl:choose、xsl:when和xsl:otherwise,xsl:if元素可以对数据实现循环查询和条件条件。

       XSLT样式文件中必须有一个与XML文档根元素匹配的模板。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  
<xsl:template match="/">
      
<html>
          
<head>
            
<title>XSLT样式表文件使用举例</title>
        
</head>
        
<body style="text-align:center">
            
<xsl:apply-templates />
        
</body>
    
</html>
  
</xsl:template>
</xsl:stylesheet> 

        每个模板以<xsl:template>标记开始,结束与</xsl:template>。其match属性说明该模板将会应用到XML中的哪个元素上去,“/”表示XML文档的根元素。

        下面我们用一个具体的例子来说明。假设有一个用于存储用户在网上购物信息的XML文件,其内容如下:

<?xml version="1.0" encoding="gb2312"?>
<?xml-stylesheet type=”text/xsl” href=”Test.xsl”?>
<shoppingcart>
  
<customer>
    
<name>赵子龙</name>
    
<email>Jerry@wlw.gor</email>
    
<zipcode>361021</zipcode>
    
<address>中国福建省厦门市</address>
  
</customer>
  
<shoppingItem>
    
<item>
      
<itemNo>1001</itemNo>
      
<itemName>三国演义</itemName>
      
<price>30.00</price>
      
<publisher>文艺出版社</publisher>
    
</item>
    
<item>
      
<itemNo>2001</itemNo>
      
<itemName>红楼梦</itemName>
      
<price>120.00</price>
      
<publisher>文艺出版社</publisher>
    
</item>
  
</shoppingItem>
</shoppingcart>

      我们为其编写一个XSLT文件,如下:

<?xml version=”1.0” encoding=”gb2312”?>
<xsl:styleshet version=”1.0” xmlns:xsl=”http://www.3w.org/1999/XSL/Transform”>
<xsl:template match=”/”>
<html>
<head>
  
<title>书籍订单</title>
</head>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match=”shoppingcart”>
    
<body>
      
<xsl:apply-templates />
        
</body>
</xsl:template>
<xsl:template match=”shoopingcart/customer”>
    
<div style=”background-color:teal; font-weight:bold;”>
    
<xsl:value-of select=”name” />
    
<xsl:value-of select=”email” />
    
<xsl:value-of select=”zipcode” />
    
<xsl:value-of select=”address” />
    
</div>
</xsl:template>
<xsl:template match=”shoppingcart/shoppingItem”>
    
<table border=”1”>
      
<thead>
        
<td><b>编号</b></td>
        
<td><b>书名</b></td>
        
<td><b>价格</b></td>
        
<td><b>出版社</b></td>
      
</thead>
      
<xsl:for-each select=”item” order-by=”-itemNo”>
         
<tr>
           
<td><b><xsl:value-of select=”itemNo” /></b></td>
           
<td><b><xsl:value-of select=”itemName” /></b></td>
           
<td><b><xsl:value-of select=”price” /></b></td>
           
<td><b><xsl:value-of select=”publisher” /></b></td>
         
</tr>
      
</xsl:for-each>
  
</table>
</xsl:template>
</xsl:stylesheet>

        上面的样式文件中共定义了四个模板,分别对应XML文件的根元素、ShoppingCart元素、ShoppingCart/Customer元素、以及ShoppingCart/ShoppingItem元素。

        在XML文件中通过

<?xml-stylesheet type=”text/xsl” href=”Test.xsl”?>
将XML文件与欲使用的XSL样式文件关联起来。当浏览器打开XML文件时,XSL解析器会将XSL文件加载,偶后开始遍历XML文件中的所有结点,在每一步都试图将当前结点与模板进行匹配。XSL解析器首先查找根结点,与根结点对应的模板是
<xsl:template match=”/”>
<html>
<head>
  
<title>书籍订单</title>
</head>
<xsl:apply-templates/>
</html>
</xsl:template>

此模板用于创建输出文档的根元素:html和head。在遇到xsl:apply-templates时,解析器移到当前结点的子结点并复复这个过程,即试图将子结点与其他模板匹配。因为当前结点是根结点,它只有一个子结点ShoppingCart,所以解析器找到与ShoppingCart相匹配的模板进行匹配

<xsl:template match=”shoppingcart”>
    
<body>
      
<xsl:apply-templates />
        
</body>
</xsl:template>

根据模板,解析器创建输出文档的Body结点。此时又遇到xsl:apply-templates,因此解析器又查找当前结点的子结点进行模板匹配。ShoppingCart有两个子结点,解析器首先找到与Customer结点匹配的模板,进行转换入理,由此在输出文档中生成顾客的联系信息。这个模板中不含有xsl:apply-templates,因为已经处理了Customer中的所有子结点,无需再向下遍历,所以解析器处理完该结点后,即返回上层结点,然后再查找ShoppingCart结点的其他子结点。

<xsl:template match=”shoppingcart/shoppingItem”>
    
<table border=”1”>
      
<thead>
        
<td><b>编号</b></td>
        
<td><b>书名</b></td>
        
<td><b>价格</b></td>
        
<td><b>出版社</b></td>
      
</thead>
      
<xsl:for-each select=”item” order-by=”-itemNo”>
         
<tr>
           
<td><b><xsl:value-of select=”itemNo” /></b></td>
           
<td><b><xsl:value-of select=”itemName” /></b></td>
           
<td><b><xsl:value-of select=”price” /></b></td>
           
<td><b><xsl:value-of select=”publisher” /></b></td>
         
</tr>
      
</xsl:for-each>
  
</table>
</xsl:template>

这个模板在输出文档中列出顾客订购的书籍清单,由于顾客可能一次订购多本书籍,故使用了xsl:for-each进行了循环处理,并为指定书籍按其序列号进行排列。

        到此,完成整个XML文档的转换并输出。

 

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/chris_mao/article/details/1826273

XML编程

在现代的开发之中,XML技术无处不在,在各个开发框架中,也都到处充斥着XML配置文件的身影。本课程将为读者讲解XML的产生背景,并且详细分析了HTML与XML的区别、XML核心语法,重点在于XML的解析技术(DOM、SAX、DOM4J工具),同时讲解了如何在HTML页面利用JavaScript进行DOM解析实现页面动态开发。官方QQ群:612148723。
  • 2016年12月31日 23:18

通过XSLT转换XML

一 介绍 XSLT是一种用来转换XML文档结构的语言,它是EXtensible Style Language Extensions Transformations的缩写。 XSLT类似与HTML中...
  • chengqiuming
  • chengqiuming
  • 2017-04-12 10:47:50
  • 942

XSLT转换XML实例

转自江边孤鸟: http://blog.csdn.net/jbgh608/archive/2007/08/31/1767414.aspxW3school 的xsl教程: http://www.w3sc...
  • superyoungchaos
  • superyoungchaos
  • 2010-01-12 14:46:00
  • 2131

[XML]学习笔记(八)XSLT

一、XSL(eXtensible Stylesheet Language)扩展样式表语言:主要包含三个部分——XSLT用于XML文档转换,XPath用于在XML文档中导航,XSL-FO用于XML文档格...
  • CristianoJason
  • CristianoJason
  • 2016-05-20 00:45:59
  • 4723

XML.转换XML的工具.XSLT

eXtensible Stylesheet Language Transformations 本身是XSL规范的一部分,专门用于对XML的树型数据进行重组转换,并可以以各种格式输出 示例//hello...
  • stringNewName
  • stringNewName
  • 2016-06-08 00:58:11
  • 837

在java代码中,用xslt处理xml文件

用java处理xml文件的方法很多,很多人觉得用起来有点复杂.所以这里提供一个在java代码中引用xslt文件处理xml文件的方法.import java.io.File;import java.io...
  • zhou_lei
  • zhou_lei
  • 2008-07-16 16:46:00
  • 2712

使用XSLT将XML数据转换成HTML

使用一个简单的 XSL 样式表就可以将 XML 数据转换成 HTML。随着 XML 规范的不断演进,在新的版本中满足每个人的需要似乎已经成为必要;不幸的是,进行简单的转换一直都困扰着规范。假设我有一个...
  • lazycatw
  • lazycatw
  • 2007-04-16 16:33:00
  • 888

java中使用xslt转换xml成为另一个xml

  • 2009年07月06日 10:04
  • 2KB
  • 下载

XML/XSD/XSLT

XSD(XML Schema Definition) XML Schema 是基于 XML 的 DTD 替代者。 XML Schema 描述 XML 文档的结构。 XML Schem...
  • lein_wang
  • lein_wang
  • 2012-07-30 11:27:50
  • 1668

同时使用 xml, schema 和 xslt 的例子

以前从来没有用过 schema, 这次希望能给我的 xml 文件加上 namespace, schema, 然后用 xslt 转换成 html, 没想到花了不少功夫。现在我把工作正常的结果记录下来,希...
  • jadedrip
  • jadedrip
  • 2005-03-02 15:04:00
  • 1454
收藏助手
不良信息举报
您举报文章:XML与XSLT
举报原因:
原因补充:

(最多只允许输入30个字)