XSL
语言
它以XSL为开始,以XSLT,XPath和XSL-FO为终结。
以XSL为开始
XSL
表示扩展样式表语言(EXtensible Stylesheet Language)。
因为基于XML样式表语言的需要,万维网联盟(W3C)开始着手发展XSL。
层叠式样式表(CSS)= HTML样式表
HTML
使用预定义标签,并且,标签的含义比较容易理解。
在HTML中,<table>元素定义了一个表格,并且,浏览器知道该如何去显示它。
给HTML元素添加样式是比较容易的。通过使用CSS,让浏览器显示具有特殊字体和颜色的元素是非常容易的。
XSL=XML
样式表
XML
不使用预定义标签(我们可以使用任何我们自己喜欢的标签名字),这些标签的含义并不容易理解。
HTML
中的<table>元素适用于定义一张表格的,因此浏览器知道该如何去显示它们。
给HTML元素添加样式是比较容易的。通过使用CSS,让浏览器显示具有特殊字体和颜色的元素是非常容易的。
XSL-
扩展样式表语言(More Than a Style Sheet Language)
XSL
由3部分组成:
XSLT-
转变XML文档的语言。
XPath-
对XML文档进行导航的语言。
XSL-FO -
格式化XML文档的语言。
关于XSLT的教程
剩下这部分的教程是关于XSLT的——转换XML文档的语言。
XSLT
介绍
XSLT
是一种把XML文件转换成XHTML文档或者其他的XML文档的语言。
XPath
是一种用于导航XML文档的语言。
你应该事先了解下面这些知识
如果你想继续下面的学习,你必须得掌握下面这些基本知识。
XML / XML
命名空间
XPath
如果你想学习上述语言,可以在网络学院找到这些教程.
什么是XSLT?
XSLT
是一种用来转换XML / XSL文档结构的语言
XSLT
是XSL最重要的部分
XSLT
可以把XML文档转换成另一个XML文档
XSLT
通过XPath对XML文档进行定位
XSLT
是一种W3C推荐标准
XSLT=XSL
转换
XSLT
是XSL的最重要的一部分。
XSLT
用于把XML文档转换成其它的XML文件,或者转换成另一种能被浏览器所识别的诸如HTML和XHTML类型的文档。通常情况下,XSLT是通过把每个XML元素转换成一个(X)HTML元素来完成的。
通过XSLT,你可以在已输出的文件里添加或删除元素和属性。你也可以把元素重新进行排列和分类,执行测试语句,决定是否隐藏元素,或者实现其它更多的功能。
我们通常这样来描述转换过程:XSLT把XML树形结构源文件换成XML树形结果。
XSLT
使用XPath的方法
XSLT
使用XPath查找XML文档中的信息。XPath用于对XML文件中的元素和属性进行定位或导航。
如果你想先学习XPath的相关知识,请先阅读我们的XPath教程.
它是怎样运行的?
在转换过程当中,XSLT使用XPath来定义源文档的某些部分,而这些源文档必须与一个或多个预定义的模版相匹配。当其中一个所匹配的源文件被找到以后,XSLT将会把这个源文件中相匹配的部分转换到结果文档中。
XSLT
是一个网络标准
XSLT
在1999年11月16日成为W3C推荐的标准。
XSLT
浏览器
几乎所有专业浏览器都支持XML和XSLT。
Mozilla Firefox
Mozilla
火狐
1.0.2
版本的火狐浏览器是支持XML和XSLT 的(以及CSS)。
Mozilla
Mozilla
含有XML外部解析器并且支持XML+CSS的显示,同时,Mozilla也支持一些命名空间。
Mozilla
可以执行XSLT。
Netscape
Netscape
版本8使用的是Mozilla引擎,因此它和Mozilla一样支持XML / XSLT。
Opera
Opera
版本9 ,支持XML和XSLT(以及CSS);Opera版本8只支持XML+CSS。
Internet Explorer
IE6
浏览器支持XML,命名空间,CSS,XSLT和XPath。
IE5.0
并不支持官方的W3C XSL推荐标准。
XSLT
转换
周日, 10/14/2007 - 14:21 — ppkosd
Example study: How to transform XML into XHTML using XSLT.
实例学习:如何通过XSLT把XML转换成XHTML。
此实例的详细情况将在下一章中作详细说明。
正确的样式表声明
我们使用根元素<xsl:stylesheet> 或<xsl:transform>对XSL样式表文档进行声明。
注意: <xsl:stylesheet> 和<xsl:transform>是完全相同的,使用哪一个都可以。
根据W3C XSLT 的推荐标准,声明 XSL 样式表的正确方法如下:
<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
或:
<xsl:transform version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
如果希望访问XSLT元素、属性和特征,那么,我们必须在文件的头部事先声明XSLT命名空间。
“xmlns:xsl="http://www.w3.org/1999/XSL/Transform” 指出了官方的W3C XSLT 命名空间。如果你使用了这个命名空间,你也必须注明属性版本“version="1.0"。
以XML源文件开始
让我们把下面的XML文档("cdcatalog.xml")转换成XHTML吧:
<?xml version="1.0" encoding="ISO-8859-1"?><catalog><cd> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <country>USA</country> <company>Columbia</company> <price>10.90</price> <year>1985</year></cd>...</catalog>
在火狐和IE浏览器中查看XML文件的方法: 打开XML文件(通常情况下是通过链接打开的)—XML文件将会显示包含颜色代码的根元素和子元素。单击左边元素的“+”和“-”,就可以展开或者收回元素结构列表。查看XML源文件的源代码(不含加号+和减号-),在浏览器菜单里选择“查看—源文件[ IE ]”或者“查看—页面源代码[ FF ]”。
在Netscape 6中查看XML文件的方法:打开XML文件,在XML文件里右键单击选择“查看—页面源代码”。XML文件将会把标有颜色代码的根元素和子元素的文档显示出来。
在Opera 7中查看XML文件的方法: 打开XML文件,在XML文件里右键单击选择“框架/查看源代码”。XML文件将会以纯文本的形式显示。
查看 "cdcatalog.xml"
创建一个XSL样式表
此时,你已经通过一个转换模板创建了一个XSL样式表文档("cdcatalog.xsl")。
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th align="left">Title</th> <th align="left">Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table></body></html></xsl:template></xsl:stylesheet>
查看"cdcatalog.xsl"
将XSL样式表连接到XML文档中
把XSL样式表参数添加到XML文件("cdcatalog.xml")中:
<?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?><catalog> <cd><title>Empire Burlesque</title><artist>Bob Dylan</artist><country>USA</country><company>Columbia</company><price>10.90</price><year>1985</year> </cd> . . . </catalog>
如果你有一个支持XSLT的浏览器,它将会准确地帮你把XML文件转换成XHTML。
查看结果
以上实例的细节部分将会在下一章中作详细说明。
<xsl:template>
XSL
样式表是由一个或多个被称为“模板” 的规则集组成的。
每个模板都包含了与每一个指定节点相匹配的应用规则。
XSLT<xsl:template>
元素
<xsl:template>
元素是用于创建模板的。
Match
属性的作用是使模板和XML与元素相匹配。Match属性也可以为整个XML文档定义模版。Match属性值是一个XPath表达式。(例如:match="/" 定义整个文档)。
接下来,让我们看一下上一章中XSL文件的简化版本:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <tr> <td>.</td> <td>.</td> </tr> </table> </body> </html></xsl:template></xsl:stylesheet>
通过上面的代码,转换的结果如下:
我的CD集
因为XSL样式表就是XML文档本身,所以它一般都从XML开始声明:<?xml version="1.0" encoding="ISO-8 59-1"?>。
下一个元素<xsl:stylesheet>,把这份文档定义为XSLT样式表文档(连同版本号和XSLT命名空间属性一起定义)。
<xsl:template>
元素定义了一份模板。Match=”/”属性使模板和XML源文档的根目录相互联结起来。
<xsl:template>
元素里面的内容定义一些HTML来对结果进行书写。
最后两行定义了模版的结束符和样式表的结束符。
查看XML文件, 查看 XSL文件, 以及最终结果
这个例子所产生的结果有点令人失望,因为没有将任何数据从XML文档中复制到结果当中。
<xsl:value-of>
<xsl:value-of>
元素是用于选取一个已选中的节点值的。
<xsl:value-of>
元素
<xsl:value-of>
元素可以用来选取一个XML元素的值,并把它添加到转换后的输出流里:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"> <html> <body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <tr> <td><xsl:value-of select="catalog/cd/title"/></td> <td><xsl:value-of select="catalog/cd/artist"/></td> </tr> </table> </body> </html></xsl:template></xsl:stylesheet>
注意: 选择(select)属性值是一个XPath表达式。XPath表达式的作用,如:对文件系统进行导航,通过在前面添加斜杠 “/” 来选择子目录。
上述代码的转换结果如下:
我的CD集
Title
|
Artist
|
Empire Burlesque
|
Bob Dylan
|
通过这个例子得到的结果同样让人有点失望,因为只有一行数据从XML文件中复制到结果。
<xsl:for-each>
可以在XSLT中使用<xsl:for-each>元素来实现循环功能。
<sxl:-each>
元素
XSL<xsl:for-each>
元素的作用是:选择所有具有指定节点集的XML元素:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html></xsl:template></xsl:stylesheet>
注意: 选择(select)属性值是一个XPath的表达式值。XPath表达式的作用,如:文件系统的导航,而这个文件系统是通过在前端添加斜杠 “/” 来选择子目录的。
上面的转换结果如下:
我的CD集
Title
|
Artist
|
Empire Burlesque
|
Bob Dylan
|
Hide your heart
|
Bonnie Tyler
|
XML
文件, XSL 文件, 以及 最终结果
过滤结果
我们也可以在<xsl:for-each>元素中添加一个选择属性来过滤XML文件中的结果。
<xsl:for-each select="catalog/cd[artist='Bob Dylan']">
合法的过滤操作是:
=(
等于)
!= (
不等于)
<
小于
>
大于
让我们来看一下调整后的XSL样式表:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"> <html><body><h2>My CD Collection</h2><table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd[artist='Bob Dylan']"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each></table></body></html> </xsl:template></xsl:stylesheet>
上面的转换结果如下:
我的CD集
Title
|
Artist
|
Empire Burlesque
|
Bob Dylan
|
<xsl:sort>
<xsl:sort>
元素用于对结果进行分类。
在哪儿放置分类信息
如果要对结果进行分类,可以在XSL文件里的<xsl:for-each>元素中添加一个<xsl:sort>元素:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <xsl:sort select="artist"/> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:for-each> </table> </body> </html></xsl:template></xsl:stylesheet>
注意: 选择(select)属性需要指明对哪些XML元素进行分类。
上述代码的转换结果如下:
我的CD集
Title
|
Artist
|
Romanza
|
Andrea Bocelli
|
One night only
|
Bee Gees
|
Empire Burlesque
|
Bob Dylan
|
Hide your heart
|
Bonnie Tyler
|
The very best of
|
Cat Stevens
|
Greatest Hits
|
Dolly Parton
|
<xsl:if>
<xsl:if>
元素的作用是:根据XML文件的内容设置一个条件语句。
<xsl:if>
元素
如果你需要对XML文件的内容设置一个条件语句,那需要向XSL文档中添加一个<xsl:if>元素。
语法
<xsl:if test="expression">......some output if the expression is true......</xsl:if>
<xsl:if>
元素应该放在哪
如果要添加一个条件语句,那么就必须在XSL文件里的<xsl:for-each>中添加一个<xsl:if>元素:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <xsl:if test="price > 10"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:if> </xsl:for-each> </table> </body> </html></xsl:template></xsl:stylesheet>
注意: 所要求的(test)属性值包括了所计算的表达式的值。
上述代码仅输出价格高于10的CD所对应的标题和艺术家。
上述代码的转换结果如下:
我的CD集
Title
|
Artist
|
Empire Burlesque
|
Bob Dylan
|
Still got the blues
|
Gary Moore
|
One night only
|
Bee Gees
|
Romanza
|
Andrea Bocelli
|
Black Angel
|
Savage Rose
|
1999 Grammy Nominees
|
Many
|
<xsl:choose>
<xsl:choose>
元素通过<xsl:when>和<xsl:otherwise>一起配合使用来表达多种条件语句。
<xsl:choose>
元素
语法
<xsl:choose><xsl:when test="expression"> ... some output ...</xsl:when><xsl:otherwise> ... some output ....</xsl:otherwise></xsl:choose>
如何提出选择条件
如果你希望向XML文件中插入一个多重条件语句,可以在XSL文件中添加<xsl:choose>,<xsl:when>以及<xsl:otherwise>元素:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <xsl:choose> <xsl:when test="price > 10"> <td bgcolor="#ff00ff"> <xsl:value-of select="artist"/></td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="artist"/></td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> </table> </body> </html> </xsl:template></xsl:stylesheet>
当CD的价格高于10 时,上述代码会将红色背景色添加到对应的”Artist”专栏。
转换结果如下:
我的CD集
Title
|
Artist
|
Empire Burlesque
|
Bob Dylan
|
Hide your heart
|
Bonnie Tyler
|
Greatest Hits
|
Dolly Parton
|
Still got the blues
|
Gary Moore
|
Eros
|
Eros Ramazzotti
|
其它案例
这里举出另外一个案例,其中包含2个<xsl:when>元素:
<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><html><body> <h2>My CD Collection</h2> <table border="1"> <tr bgcolor="#9acd32"> <th>Title</th> <th>Artist</th> </tr> <xsl:for-each select="catalog/cd"> <tr> <td><xsl:value-of select="title"/></td> <xsl:choose> <xsl:when test="price > 10"> <td bgcolor="#ff00ff"> <xsl:value-of select="artist"/></td> </xsl:when> <xsl:when test="price < 9"> <td bgcolor="#cccccc"> <xsl:value-of select="artist"/></td> </xsl:when> <xsl:otherwise> <td><xsl:value-of select="artist"/></td> </xsl:otherwise> </xsl:choose> </tr> </xsl:for-each> </table> </body> </html></xsl:template></xsl:stylesheet>
当CD的价格高于10时,上面的这些代码会将红色背景色添加到对应的“Artist”专栏;当CD的价格大于9小于等于10时,会将灰色背景色添加到对应的“Artist”专栏。
转换结果如下:
我的CD集
Title
|
Artist
|
Empire Burlesque
|
Bob Dylan
|
Hide your heart
|
Bonnie Tyler
|
Greatest Hits
|
Dolly Parton
|
Still got the blues
|
Gary Moore
|
Eros
|
Eros Ramazzotti
|
<xsl:apply-templates>
<xsl:apply-templates>
color: #494949; line-heigh
分享到:
评论