学习资源:

1. http://www.w3school.com.cn/xsl/

2. https://www6.software.ibm.com/developerworks/cn/education/xml/x-introxslt/section2.html

 

 

1.XSLT的概念

我们首先来澄清一个概念,大家可能听说过XSL(eXtensible Stylesheet Language),XSL和我们这里说的XSLT从狭义上理解是一样的,而按照W3C的标准,XSLT的说法更严格些,因此我们在文章中统一使用 XSLT的称法。它们之间具体的关系我们会在下面讲述。

1.1 什么是XSLT

XSLT的英文标准名称为eXtensible Stylesheet Language Transformation。根据W3C的规范说明书(http://www.w3.org/TR/xslt),最早设计XSLT的用意是帮助XML文 档(document)转换为其它文档。但是随着发展,XSLT已不仅仅用于将XML转换为HTML或其它文本格式,更全面的定义应该是:

XSLT是一种用来转换XML文档结构的语言。

1.2 为什么要用XSLT

我们已经知道,XML是一种电脑程序间交换原始数据的简单而标准的方法。它的成功并不在于它容易被人们书写和阅读,更重要的是,它从根本上解决了应用系统 间的信息交换。因为XML满足了两个基本的需求:

(1).将数据和表达形式分离。就象天气预报的信息可以显示在不同的设备上,电视,手机或者其它。

(2).在不同的应用之间传输数据。电子商务数据交换的与日俱增使得这种需求越来越紧迫。

为了使数据便于人们的阅读理解,我们需要将信息显示出来或者打印出来,例如将数据变成一个HTML文件,一个PDF文件,甚至是一段声音;同样,为了使数 据适合不同的应用程序,我们必须有能够将一种数据格式转换为另一种数据格式,比如需求格式可能是一个文本文件,一个SQL语句,一个HTTP信息,一定顺 序的数据调用等。而XSLT就是我们用来实现这种转换功能的语言。将XML转换为HTML,是目前XSLT最主要的功能。

 

1.3 什么是XPath


XPath是XSLT的重要组成部分,我们将在第四章讲解它的详细语法。那么XPath是什么呢?我们首先来了解一下XSL系列的"家族"关系。如下图:




XSL在转换XML文档时分为明显的两个过程,第一转换文档结构;其次将文档格式化输出。这两步可以分离开来并单独处理,因此XSL在发展过程中逐渐分裂 为XSLT(结构转换)和XSL-FO(formatting objects)(格式化输出)两种分支语言,其中XSL-FO的作用就类似CSS在HTML中的作用。而我们这里重点讨论的是第一步的转换过程,也就是 XSLT。


另外,在学习XML时我们已经知道XML是一个完整的树结构文档。在转换XML文档时可能需要处理其中的一部分(节点)数据,那么如何查找和定位XML文 档中的信息呢,XPath就是一种专门用来在XML文档中查找信息的语言。XPath隶属XSLT,因此我们通常会将XSLT语法和XPath语法混在一 起说。


用一种比较好理解的解释:如果将XML文档看作一个数据库,XPath就是SQL查询语言;如果将XML文档看成DOS目录结构,XPath就是 cd,dir等目录操作命令的集合。

 

1.4 XSLT和CSS的比较

CSS同样可以格式化XML文档,那么有了CSS为什么还需要XSLT呢?因为CSS虽然能够很好的控制输出的样式,比如色彩,字体,大小等,但是它有严 重的局限性,就是:

(1) CSS不能重新排序文档中的元素;

(2) CSS不能判断和控制哪个元素被显示,哪个不被显示;

(3) CSS不能统计计算元素中的数据;

换句话说,CSS只适合用于输出比较固定的最终文档。CSS的优点是简洁,消耗系统资源少;而XSLT虽然功能强大,但因为要重新索引XML结构树,所以 消耗内存比较多。

因此,我们常常将它们结合起来使用,比如在服务器端用XSLT处理文档,在客户端用CSS来控制显示。可以减少响应时间。

 

 

(1)cdcatalog_with_xsl.xml

 


<?xml version="1.0" encoding="utf-8"?>  <!--引用xslt转换xml-->  
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>  
<catalog>  
	<cd>  
		<title>One night only</title>  
		<artist>Bee Gees</artist>  
		<country>UK</country>  
		<company>Polydor</company>  
		<price>10.90</price>  
		<year>1998</year>  
	</cd>  
	 
	<cd>  
		<title>One night only</title>  
		<artist>Bee Gees</artist>  
		<country>UK</country>  
		<company>Polydor</company>  
		<price>10.90</price>  
		<year>1998</year>  
	</cd>  
	 
	<cd>  
		<title>One night only</title>  
		<artist>Bee Gees</artist>  
		<country>UK</country>  
		<company>Polydor</company>  
		<price>10.90</price>  
		<year>1998</year>  
	</cd>  
	 
	<cd>  
		<title>One night only</title>  
		<artist>Bee Gees</artist>  
		<country>UK</country>  
		<company>Polydor</company>  
		<price>10.90</price>  
		<year>1998</year>  
	</cd>  
	 
	<cd>  
		<title>One night only</title>  
		<artist>Bee Gees</artist>  
		<country>UK</country>  
		<company>Polydor</company>  
		<price>10.90</price>  
		<year>1998</year>  
	</cd>  
	 
	<cd>  
		<title>One night only</title>  
		<artist>Bee Gees</artist>  
		<country>UK</country>  
		<company>Polydor</company>  
		<price>10.90</price>  
		<year>1998</year>  
	</cd>  
	 
	<cd>  
		<title>One night only</title>  
		<artist>Bee Gees</artist>  
		<country>UK</country>  
		<company>Polydor</company>  
		<price>10.90</price>  
		<year>1998</year>  
	</cd>  
	 
</catalog>

  

(2)cdcatalog.xsl

 


<?xml version="1.0" encoding="utf-8" ?><!-- 声明一个 XSL 样式表 -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!--match 属性的值是 XPath 表达式(match="/" 表示匹配整个文档)-->
  <xsl:template match="/">
    <html>
    <body>
    <h2>My CD Collection</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th align="left">标题</th>
        <th align="left">作者</th>
        <th align="left">国家</th>
        <th align="left">价格</th>
        <th align="left">年份</th>
      </tr>
      <!-- select="catalog/cd[country='UK'] 选取catalog根节点下cd节点下country元素值为"UK"的CD节点集合-->
      <xsl:for-each select="catalog/cd[country='UK']">
        <!-- 按artist排序-->
        <xsl:sort select="artist"/>
        <!--判定条件 price值>8 执行 xsl:if体 -->
        <xsl:if test="price > 8">
          <tr> 
            <!--多重条件判定,结合 when,otherwise使用-->
            <xsl:choose>
              <xsl:when test="price > 9">
                <!-- xsl:value 输出元素值-->
                <td bgcolor="#ff00ff"><xsl:value-of select="title"/></td>
              </xsl:when>
              <xsl:otherwise>
                <td><xsl:value-of select="title"/></td>
              </xsl:otherwise>
            </xsl:choose>
            <td><xsl:value-of select="artist"/></td>
            <td><xsl:value-of select="country"/></td>
            <td><xsl:value-of select="price"/></td>
            <td><xsl:value-of select="year"/></td>
          </tr>
        </xsl:if>
      </xsl:for-each>
    </table>
    </body>
    </html>
  </xsl:template>
</xsl:stylesheet>