《XML案例教程》课件第6章_第1页
《XML案例教程》课件第6章_第2页
《XML案例教程》课件第6章_第3页
《XML案例教程》课件第6章_第4页
《XML案例教程》课件第6章_第5页
已阅读5页,还剩148页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章XSLT模板转换6.1XSLT概述6.2XSLT基本结构6.3XSLT模板规则6.4常用输出指令6.5节点选择与路径匹配6.6流程控制6.7元素排序6.8综合实例6.9本章小结习题6

6.1XSLT概述

XML文档只能表现数据的内容,而实际应用中数据往往表现为形式。CSS是表现数据形式的一种样式语言,在第5章中进行了详细讨论,本章将介绍另外一种表现XML文档的样式语言XSL(ExtensibleStylesheetLanguage)。

XSL包含两部分内容:XSLT(XSLTransformation)和FO(FormatObject)。XSLT可以将XML文档转换为其他文档形式,如XML、HTML、TEXT等。FO用于格式化输出,W3C对FO还未形成统一标准,本章将不予讨论。本章主要介绍如何使用XSLT将XML文档转换为其他XML文档、HTML和TEXT文档。

6.2XSLT基本结构

本节通过一个案例来介绍XSLT的基本结构。例6-1中的ch6-1.xml文档保存了一本图书的基本信息,ch6-1.xsl文档为外部样式文档可以输出ch6-1.xml的数据。【例6-1】

案例说明:引入外部XSL样式文件输出XML文档的数据。

程序名称:ch6-1.xml

01<?xmlversion="1.0"encoding="UTF-8"?>

02<?xml-stylesheettype="text/xsl"href="ch6-1.xsl"?>

03<Book>

04<Title>软件工程</Title>

05<Author>邓良松,刘海岩,陆丽娜</Author>06<Publisher>西安电子科技大学出版社</Publisher>

07<PubDate>2001年6月</PubDate>

08<ISBN>7-5606-0924-4</ISBN>

09</Book>程序名称:ch6-1.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<xsl:value-ofselect="*"/>

05</xsl:template>

06</xsl:stylesheet>案例分析:在程序ch6-1.xml中语句2使用xml-stylesheet处理指令引入外部样式文件。type的属性值“text/xsl”指明加载的外部文件为XSL文件。href属性指出加载的外部文件路径,路径有三种:绝对路径、相对路径和Web路径。绝对路径指外部XSL文件存放在本地某个文件夹中,一般该文件与XML文档不在同一个文件夹中,引用时需写出文件的本地完整路径,如“C:\Test\ch6-1.xsl”。相对路径指外部XSL文件与XML文件在相同的文件夹中,引用时只需写出XSL文件名称即可,如程序ch6-1.xml中第2行对“ch6-1.xsl”的引用。Web路径指外部XSL文件位于远程Web服务器上,引用时需要写出完整的服务器域名地址和文件目录路径,如“3/xsl/ch6-1.xsl”。6.2.1XML文档节点树

使用XSL转换XML文档,一个完整的XML文档可以转换为一棵结构完整的节点树。图6-1所示是例6-1中程序ch6-1.xml文档对应的节点树。节点树中的根节点在XSL中用“/”表示,而不是XML文档的根元素Book。XML文档的根元素只能作为节点树中根节点的一个子节点。程序ch6-1.xml中第2行引入外部样式文件的处理指令也是根节点的一个子节点。图6-1例6-1中ch6-1.xml文档转换后的节点树

XML文档中,元素、元素属性、元素文本内容、注释和处理指令都是节点树中的一个节点。搜索XML中的数据时,从节点树的根节点开始搜索。节点树为XSL访问XML文档提供了高效、有序的组织结构。6.2.2XSL样式单结构

例6-1中程序ch6-1.xsl描述了XSL样式单的基本结构。XSL文档本质上是XML文档,任何XSL文档中的第一行语句必须是XML的声明语句,如程序ch6-1.xsl中的第1行为XML的声明语句,表明该样式文档为XML文档,样式文档中标记的使用必须符合XML规范。程序ch6-1.xsl第2行中的xmlns:xsl=“/1999/XSL/Transform"声明了一个命名空间,并与字符串xsl绑定,该命名空间是W3C在1999年11月16日发布的XSL转换语言标准。XSL文档的根元素为<xsl:stylesheet>,它是命名空间xsl中的一个元素。版本号version="1.0"是元素<xsl:stylesheet>的一个属性。第3行至第5行中的元素和属性都属于xsl命名空间。具体应用在下节中介绍。

6.3XSLT模板规则

模板规则是XSL转换中最重要的部分。模板转化需要使用模板定义元素</xsl:template>和模板调用元素</xsl:apply-templates>,本节将讨论模板定义语法和模板调用规则。【例6-2】

案例说明:使用模板规则将XML文档转换为HTML文档。

程序名称:ch6-2.xml

01<?xmlversion="1.0"encoding="UTF-8"?>

02<?xml-stylesheettype="text/xsl"href="ch6-2.xsl"?>

03<BookList>

04<Book>

05<Title>软件系统开发技术(修订版)</Title>

06<Author>潘锦平,施小英,姚天昉</Author>

07<Publisher>西安电子科技大学出版社</Publisher>

08<PubDate>2001年1月</PubDate>09<ISBN>7-5606-0492-7</ISBN>

10</Book>

11<Book>

12<Title>软件工程</Title>

13<Author>邓良松,刘海岩,陆丽娜</Author>

14<Publisher>西安电子科技大学出版社</Publisher>

15<PubDate>2001年6月</PubDate>

16<ISBN>7-5606-0924-4</ISBN>

17</Book>

18</BookList>程序名称:ch6-2.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<html>

05<head>

06<title>图书信息简介</title>

07</head>

08<body>09<xsl:apply-templatesselect="BookList"/>

10</body>

11</html>

12</xsl:template>

13<xsl:templatematch="BookList">

14<tablewidth="650"align="center"cellpadding="1"cellspacing="1">

15<trbgcolor="#c0c060">

16<th>书名</th>

17<th>作者</th>

18<th>出版社</th>19<th>出版日期</th>

20<th>ISBN</th>

21</tr>

22<xsl:apply-templatesselect="Book"/>

23</table>

24</xsl:template>

25<xsl:templatematch="Book">

26<trbgcolor="#ffffc0">

27<td><xsl:value-ofselect="Title"/></td>

28<td><xsl:value-ofselect="Author"/></td>

29<td><xsl:value-ofselect="Publisher"/></td>30<td><xsl:value-ofselect="PubDate"/></td>

31<td><xsl:value-ofselect="ISBN"/></td>

32</tr>

33</xsl:template>

34</xsl:stylesheet>6.3.1模板定义元素和调用元素

例6-2中的程序ch6-2.xsl文件将程序ch6-2.xml文档转换为HTML文档。元素</xsl:template>定义输入模板,属性match指定将此模板规则应用于输入文档的哪个节点,如ch6-2中的第3行将模板规则应用于输入文档的根节点,第13行将模板规则应用于输入文档的根元素BookList,第25行将模板应用于子元素Book。

调用元素</xsl:apply-templates>通常放在输出模板中,属性select指定要处理的节点集。处理时,会将节点集中节点依次与样式单中的模板进行比较,与节点匹配的模板输出将被放在该元素所在位置。6.3.2模板转换过程

例6-2中的ch6-2.xsl将ch6-2.xml转换为HTML文档的过程如下:

(1)程序ch6-2.xsl第03行至第08行将结果树的根节点“/”与样式单中的模板进行匹配,首先输出如下内容:

<html>

<head>

<title>图书信息简介</title>

</head>

<body>

(2)程序ch6-2.xsl第09行使用<xsl:apply-templatesselect="Booklists"/>处理XML文档的根元素节点Booklists,将BookList节点与样式表中第13行的模板<xsl:templatematch="BookList">进行匹配,输出第14行至第21行的内容:

<tablewidth="650"align="center"cellpadding="1"cellspacing="1">

<trbgcolor="#c0c060">

<th>书名</th>

<th>作者</th>

<th>出版社</th>

<th>出版日期</th>

<th>ISBN</th>

</tr>

(3)程序ch6-2.xsl第22行的<xsl:apply-templatesselect="Book"/>对当前节点下所有Book元素进行处理,将所有Book元素节点与样式表中第25行的模板<xsl:templatematch="Book">进行匹配。在第26行至第32行的模板输出代码中使用指令<xsl:value-of>将Book的子元素Title、Author、Publisher、PubDate和ISBN内容输出到表格的单元格中。<xsl:value-of>指令的select属性用于选择被提取的节点。如程序ch6-2.xsl第27行<td><xsl:value-ofselect="Title"/></td>将XML文档ch6-2.xml第05行和第12行的元素Title的内容“软件系统开发技术(修订版)”和“软件工程”依次提取到表格的单元格中。程序ch6-2.xsl第25行至第33行模板执行后输出如下的内容:<trbgcolor="#ffffc0">

<td>软件系统开发技术(修订版)</td>

<td>潘锦平,施小英,姚天昉</td>

<td>西安电子科技大学出版社</td>

<td>2001年1月</td>

<td>7-5606-0492-7</td>

</tr>

<trbgcolor="#ffffc0">

<td>软件工程</td>

<td>邓良松,刘海岩,陆丽娜</td>

<td>西安电子科技大学出版社</td>

<td>2001年6月</td>

<td>7-5606-0924-4</td>

</tr>

(4)当XML文档ch6-1.xml中所有Book元素被处理完毕后,程序ch6-2.xsl执行第23行的模板输出剩余标记</table>。

(5)程序ch6-2.xsl执行到第24行</xsl:template>,第一个模板<xsl:apply-templatesselect="BookList"/>执行完毕。继续执行第10行至第12行输出模板<xsl:templatematch="/">中剩余标记</body>和</html>。例6-2中的程序处理完毕后输出的HTML文档如下:

<html>

<head>

<title>图书信息简介</title>

</head>

<body>

<tablewidth="650"align="center"cellpadding="1"cellspacing="1">

<trbgcolor="#c0c060">

<th>书名</th>

<th>作者</th>

<th>出版社</th>

<th>出版日期</th>

<th>ISBN</th>

</tr>

<trbgcolor="#ffffc0">

<td>软件系统开发技术(修订版)</td>

<td>潘锦平,施小英,姚天昉</td>

<td>西安电子科技大学出版社</td>

<td>2001年1月</td>

<td>7-5606-0492-7</td>

</tr>

<trbgcolor="#ffffc0">

<td>软件工程</td>

<td>邓良松,刘海岩,陆丽娜</td>

<td>西安电子科技大学出版社</td>

<td>2001年6月</td>

<td>7-5606-0924-4</td>

</tr>

</table>

</body>

</html>输出的HTML文档在浏览器中的运行结果如图6-2

所示。图6-2例6-2输出的HTML文档在浏览器中的运行结果

6.4常用输出指令

上节介绍了XSLT的模板规则,每一模板规则都定义了一组处理指令和规则。本节将着重介绍常用输出指令。6.4.1输出文本

输出文本所用到的指令为<xsl:value-of>,主要应用就是输出元素文本内容。其语法如下:

<xsl:value-ofselect=“expression”disable-output-escaping=“yes|no”/>

其属性取值见表6-1。表6-1输出文本属性取值在上节的例6-2中程序ch6-2.xsl第27行至第31行已经对<xsl:value-of>指令的使用作了分析,这里不再重复。6.4.2生成元素

指令<xsl:element>可用于动态生成元素,生成的元素被直接输出到目标文档中。其语法如下:

<xsl:elementname=“name”namespace=“URI”use-attribute-sets=“attnamelist”>

<!--Content:template-->

</xsl:element>

其属性取值见表6-2。表6-2生成元素属性取值【例6-3】

案例说明:使用<xsl:element>指令生成元素。

程序名称:ch6-3.xml

01<?xmlversion="1.0"encoding="UTF-8"?>

02<?xml-stylesheettype="text/xsl"href="ch6-3.xsl"?>

03<BookList>

04<Book>

05<Title>软件系统开发技术(修订版)</Title>

06<Author>潘锦平,施小英,姚天昉</Author>

07<Publisher>西安电子科技大学出版社</Publisher>08<PubDate>2001年1月</PubDate>

09<ISBN>7-5606-0492-7</ISBN>

10</Book>

11<Book>

12<Title>软件工程</Title>

13<Author>邓良松,刘海岩,陆丽娜</Author>

14<Publisher>西安电子科技大学出版社</Publisher>

15<PubDate>2001年6月</PubDate>

16<ISBN>7-5606-0924-4</ISBN>

17</Book>

18</BookList>程序名称:ch6-3.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<html>

05<head>

06<title>图书信息简介</title>

07</head>

08<body>09<xsl:apply-templatesselect="BookList"/>

10</body>

11</html>

12</xsl:template>

13<xsl:templatematch="BookList">

14<tablewidth="650"align="center"cellpadding="1"cellspacing="1">

15<trbgcolor="#c0c060">

16<th>编号</th>

17<th>书名</th>

18<th>作者</th>

19<th>出版社</th>20<th>出版日期</th>

21<th>ISBN</th>

22</tr>

23<xsl:apply-templatesselect="Book"/>

24</table>

25</xsl:template>

26<xsl:templatematch="Book">

27<trbgcolor="#ffffc0">

28<td>

29<xsl:elementname="a">30<xsl:value-ofselect="position()"/>

31</xsl:element>

32</td>

33<td><xsl:value-ofselect="Title"/></td>

34<td><xsl:value-ofselect="Author"/></td>

35<td><xsl:value-ofselect="Publisher"/></td>

36<td><xsl:value-ofselect="PubDate"/></td>

37<td><xsl:value-ofselect="ISBN"/></td>

38</tr>

39</xsl:template>

40</xsl:stylesheet>案例分析:例6-3中的程序ch6-3.xsl第29行至第31行在表格的第一个单元格生成一个元素a,元素a的取值为当前Book元素的编号。函数position()取当前元素的编号。XML文档ch6-3.xml被转换为HTML文档后在浏览器中的运行结果如图6-3所示。图6-3例6-3中程序动态产生元素编号后在浏览器中的运行结果6.4.3生成属性

指令<xsl:attribute>用于创建属性,并将属性添加到元素节点中。其语法如下:

<xsl:attributename=“attributename”namespace=“uri”>

<!--Content:template-->

</xsl:attribute>

其属性取值见表6-3。表6-3生成属性取值

【例6-4】

案例说明:使用<xsl:attribute>指令生成属性。程序ch6-4.xsl将例6-3中XML文档ch6-3.xml转换成HTML文档。程序名称:ch6-4.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<html>

05<head>

06<title>图书信息简介</title>

07</head>

08<body>09<xsl:apply-templatesselect="BookList"/>

10</body>

11</html>

12</xsl:template>

13<xsl:templatematch="BookList">

14<tablewidth="650"align="center"cellpadding="1"cellspacing="1">

15<trbgcolor="#c0c060">

16<th>编号</th>

17<th>书名</th>

18<th>作者</th>19<th>出版社</th>

20<th>出版日期</th>

21<th>ISBN</th>

22</tr>

23<xsl:apply-templatesselect="Book"/>

24</table>

25</xsl:template>

26<xsl:templatematch="Book">

27<trbgcolor="#ffffc0">

28<td>

29<xsl:elementname="a">30<xsl:attributename="href">

31Book.xml?id=<xsl:value-ofselect="position()"/>

32</xsl:attribute>

33<xsl:value-ofselect="position()"/>

34</xsl:element>

35</td>

36<td><xsl:value-ofselect="Title"/></td>

37<td><xsl:value-ofselect="Author"/></td>38<td><xsl:value-ofselect="Publisher"/></td>

39<td><xsl:value-ofselect="PubDate"/></td>

40<td><xsl:value-ofselect="ISBN"/></td>

41</tr>

42</xsl:template>

43</xsl:stylesheet>案例分析:例6-4中的ch6-4.xsl文档第29行至第34行首先使用<xsl:element>指令创建一个元素a,元素a取值为例6-3中ch6-3.xml文档当前Book元素的编号。然后为元素a创建一个属性href,属性取值为Book.xml加当前Book元素的编号。如当前Book元素的编号为1时,创建的元素结构为<ahref="Book.xml?id=1">1</a>,该元素为超链接,显示在表格的第一个单元格中,如图6-4所示。图6-4程序ch6-4.xsl将XML文档ch6-3.xml转换成HTML文档在浏览器中的运行结果6.4.4输出注释

指令<xsl:comment>用于在结果树中创建一个注释节点。其语法如下:

<xsl:comment>

<!--Content:template-->

</xsl:comment>

例如,<xsl:comment>Thisisacomment!</xsl:comment>在结果树中创建一个注释节点<!--Thisisacomment-->。

6.5节点选择与路径匹配

本节介绍路径匹配和节点的选择方式。

6.5.1使用通配符

1.点号和星号匹配符

点号(.)用于提取当前元素节点以及当前元素节点下所有子节点的值,星号(*)用于提取任意名称的元素节点值。点号可以匹配指令、注释和文本节点,而星号只能匹配文本节点。星号只有在根节点(“/”)的模板中才能匹配所有子节点,而用于匹配非根节点的子节点时,只能匹配节点的第一个子节点。点号可以用于匹配非根节点的所有子节点。

【例6-5】

案例说明:使用点号提取例6-3中ch6-3.xml文档中的指令,并分别使用点号和星号提取XML文档ch6-3.xml中BookList元素的子元素内容。程序名称:ch6-5.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<html>

05<head>

06<title>点号和星号的用法</title>

07</head>

08<body>

09<xsl:apply-templates/>10</body>

11</html>

12</xsl:template>

13<xsl:templatematch="processing-instruction()">

14<h4>1.使用"."匹配指令:</h4>

15<xsl:value-ofselect="."/>

16</xsl:template>

17<xsl:templatematch="BookList">

18<h4>2.使用"."匹配BookList元素子节点:</h4>

19<xsl:value-ofselect="."/>20<h4>3.使用"*"匹配BookList元素子节点:</h4>

21<xsl:value-ofselect="*"/>

22</xsl:template>

23</xsl:stylesheet>案例分析:第09行对例6-3中ch6-3.xml文档对应的结果树的根节点应用模板。第13行至第16行匹配根节点下的指令,processing-instruction()函数选择指令,使用“.”取出指令的值。第17行至第21行匹配根元素BookList元素的子元素,使用“.”取出所有子元素Book的内容,使用“*”取出第一个子元素Book的内容。程序ch6-5.xsl加载到XML文档ch6-3上执行的结果如图6-5所示。图6-5程序6-5.xsl匹配例6-3中ch6-3.xml文档节点在浏览器中的显示结果说明:XSL中可以使用节点类型的函数选择节点。除使用processing-instruction()函数选择指令外,还可以使用comment()函数选择注释节点,使用text()函数选择文本节点,使用node()函数选择任意节点。

2.根节点匹配符和根元素匹配符

“/”为根节点匹配符,匹配根节点的模板一般不可少。“/*”匹配任意的根元素。

例6-5中的第17行<xsl:templatematch="BookList">可以更改为<xsl:templatematch="/*">。

3.当前节点和父节点匹配符

当前节点用点号表示,当前节点的父节点用双点号表示。【例6-6】

案例说明:使用当前节点和父节点匹配选择元素。

程序名称:ch6-6.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<html>

05<head>

06<title>当前节点和当前节点父节点的使用</title>07</head>

08<body>

09<xsl:apply-templatesselect="BookList/Book/Title"/>

10</body>

11</html>

12</xsl:template>

13<xsl:templatematch="Title">

14<h4>1.当前节点(.)使用:</h4>

15<xsl:value-ofselect="."/>16<h4>2.父节点(..)使用:</h4>

17<xsl:value-ofselect="../Publisher"/>

18</xsl:template>

19</xsl:stylesheet>案例分析:第15行使用“.”选择当前节点Title的值。第17行<xsl:value-ofselect="../Publisher"/>选择当前节点Title的父节点的子节点Publisher的值。程序加载到例6-3中的ch6-3.xml文档上的结果如图6-6所示。图6-6当前节点和父节点匹配使用6.5.2路径选择

1.绝对路径和相对路径

绝对路径指从根节点到指定节点的路径;相对路径指从当前节点到指定节点的路径。路径中的目录使用“/”作为分隔符。

例6-3中ch6-3.xml文档“Title”节点的绝对路径为/BookList/Book/Title。如果当前节点为BookList,则“Title”节点的相对路径为Book/Title。

2.在select属性中使用路径选择

【例6-7】

案例说明:在select属性中使用路径选择。程序名称:ch6-7.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<xsl:apply-templatesselect="BookList/Book"/>

05</xsl:template>

06<xsl:templatematch="Book">07<xsl:value-ofselect="Title"/><br/>

08</xsl:template>

09</xsl:stylesheet>

案例分析:第04行在select中使用相对路径匹配Book元素。

3.在match属性中使用路径选择

【例6-8】

案例说明:在match属性中使用路径选择查找元素。程序名称:ch6-8.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<xsl:apply-templates/>

05</xsl:template>

06<xsl:templatematch="/BookList/Book">07<xsl:value-ofselect="Title"/><br/>

08</xsl:template>

09</xsl:stylesheet>

案例分析:第06行在match中使用绝对路径匹配Book元素。

4.路径中使用星号

在路径中可以用星号代替任意元素节点名称。星号可以匹配结果树中某一层中的任意元素。

【例6-9】

案例说明:星号在路径中的使用。程序名称:ch6-9.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<xsl:apply-templatesselect="/BookList/*/Title"/>

05</xsl:template>

06<xsl:templatematch="Title">07<xsl:value-ofselect=“.”/><br/>

08</xsl:template>

09</xsl:stylesheet>

案例分析:第04行在ch6-3.xml文档对应的结果树中使用*代替中间层的Book元素。

5.路径中使用“//”

在路径中使用“//”可以直接引用任意层的后代节点。

例6-9中程序ch6-9.xsl的第04行标记<xsl:apply-templatesselect="/BookList/*/Title"/>中的“*”可以使用“//”代替。如<xsl:apply-templatesselect="/BookList//Title"/>。6.5.3选择元素属性

可使用“@”选择元素属性。

【例6-10】

案例说明:使用“@”输出元素属性值。程序名称:ch6-4.xml

01<?xmlversion="1.0"encoding="UTF-8"?>

02<?xml-stylesheettype="text/xsl"href="ch6-9.xsl"?>

03<BookList>

04<BookCategory="计算机">

05<Title>软件系统开发技术(修订版)</Title>

06<Author>潘锦平,施小英,姚天昉</Author>

07<Publisher>西安电子科技大学出版社</Publisher>

08<PubDate>2001年1月</PubDate>

09<ISBN>7-5606-0492-7</ISBN>10</Book>

11<BookCategory="小说">

12 <Title>基督山伯爵(上下册)</Title>

13 <Author>大仲马(法)</Author>

14 <Publisher>上海译文出版社</Publisher>

15 <PubDate>2001年8月</PubDate>

16 <ISBN>7-5327-2651-7</ISBN>

17 </Book>

18</BookList>程序名称:ch6-10.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<xsl:apply-templatesselect="BookList/Book"/>

05</xsl:template>

06<xsl:templatematch="Book">

07<ul>08<li>书名:<xsl:value-ofselect=“Title”/><br/>

09类别:<xsl:value-ofselect=“@Category”/>

10</li>

11</ul>

12</xsl:template>

13</xsl:stylesheet>

案例分析:例6-10中程序ch6-4.xml第04行和第11行Book元素声明属性Category,程序ch6-10.xsl第09行指令<xsl:value-ofselect="@Category"/>提取Category的值。6.5.4使用条件选择节点

可以在元素名称后使用“[]”为选择的元素添加限制条件。

如在例6-10中的ch6-4.xml文档中选择具有子元素“Publisher”的“Book”元素,并输出书名,可以使用如下的模板规则:

<xsl:templatematch=“Book[Publisher]”>

<xsl:value-ofselect=“Title”/>

</xsl:template>在“[]”中使用“|”组合多个限制条件。如选择具有“Publisher”或者“ISBN”的元素节点,match的属性值可以更改为“Book[Publisher|ISBN]”。

在“[]”中使用“@”来指定元素带有属性。如选择具有属性“Category”的元素,match的属性值可以更改为“Book[@Category]”。

在“[]”可以使用表达式选择节点。如选择属性“Category”为“计算机”的Book元素,match的属性值可以更改为“Book[@Category='计算机']”。

6.6流程控制

XSL中的流程控制主要有单条件流程控制、多条件流程控制(多条件选择)和循环处理。

6.6.1单条件流程控制

XSL中的单条件流程控制指令为<xsl:if>元素,该指令的使用语法如下:

<xsl:iftest=“expression”><!--Content:template--></xsl:if>

属性test为条件表达式。

【例6-11】

案例说明:使用<xsl:if>指令选取例6-10中ch6-4.xml文档中Category值为“计算机”的图书信息。程序ch6-11.xsl中给出模板规则。程序名称:ch6-11.xsl

01<xsl:templatematch="Book">

02<xsl:iftest="@Category='计算机'">

03<trbgcolor="#ffffc0">

04<td><xsl:value-ofselect="Title"/></td>

05<td><xsl:value-ofselect="Author"/></td>

06<td><xsl:value-ofselect="Publisher"/></td>

07<td><xsl:value-ofselect="PubDate"/></td>

08<td><xsl:value-ofselect="ISBN"/></td>09<td><xsl:value-ofselect=“@Category”/></td>

10</tr>

11</xsl:if>

12</xsl:template>

案例分析:第02行至第11行使用<xsl:if>指令对图书内容有条件地输出,属性test的值为“@Category='计算机'”表示输出所有计算机类图书。6.6.2多条件选择

指令<xsl:choose>、<xsl:when>和<xsl:otherwise>扩展了<xsl:if>的功能。<xsl:choose>的子元素<xsl:when>用于提供多条件选择,<xsl:otherwise>提供类似于else的功能。

【例6-12】

案例说明:以不同颜色输出程序ch6-4.xml中不同类别的图书。程序ch6-12.xsl中给出模板规则。程序名称:ch6-12.xsl

01<xsl:templatematch="Book">

02<xsl:choose>

03<xsl:whentest="@Category='计算机'">

04<trbgcolor="#ffffc0">

05<td><xsl:value-ofselect="Title"/></td>

06<td><xsl:value-ofselect="Author"/></td>

07<td><xsl:value-ofselect="Publisher"/></td>

08<td><xsl:value-ofselect="PubDate"/></td>09<td><xsl:value-ofselect="ISBN"/></td>

10<td><xsl:value-ofselect="@Category"/></td>

11</tr>

12</xsl:when>

13<xsl:otherwise>

14<trbgcolor="#ffc0c0">

15<td><xsl:value-ofselect="Title"/></td>

16<td><xsl:value-ofselect="Author"/></td>

17<td><xsl:value-ofselect="Publisher"/></td>

18<td><xsl:value-ofselect="PubDate"/></td>19<td><xsl:value-ofselect="ISBN"/></td>

20<td><xsl:value-ofselect="@Category"/></td>

21</tr>

22</xsl:otherwise>

23</xsl:choose>

24</xsl:template>案例分析:第03行判断图书的类别是否为“计算机”,如果是“计算机”,则以背景色“#ffffc0”输出图书内容,其中第04行设置表格行背景色。如果图书的类别不是“计算机”,则以背景色“#ffc0c0”输出图书的内容,背景色设置在第14行完成。6.6.3循环处理

XSL中可以使用<xsl:for-each>元素实现循环功能。

【例6-13】

案例名称:使用指令<xsl:for-each>代替模板规则实现从ch6-4.xml文档中提取数据。程序ch6-13.xsl给出使用<xsl:for-each>处理BookList元素和Book元素的代码片段。程序名称:ch6-13.xsl

01<xsl:for-eachselect="BookList">

02<tablewidth="650"align="center"cellpadding="1"cellspacing="1">

03<trbgcolor="#c0c060">

04<th>书名</th>

05<th>作者</th>

06<th>出版社</th>

07<th>出版日期</th>

08<th>ISBN</th>

09<th>类别</th>10</tr>

11<xsl:for-eachselect="Book">

12<trbgcolor="#ffffc0">

13<td><xsl:value-ofselect="Title"/></td>

14<td><xsl:value-ofselect="Author"/></td>

15<td><xsl:value-ofselect="Publisher"/></td>

16<td><xsl:value-ofselect="PubDate"/></td>

17<td><xsl:value-ofselect="ISBN"/></td>

18<td><xsl:value-ofselect="@Category"/></td>19</tr>

20</xsl:for-each>

21</table>

22</xsl:for-each>案例分析:第01行的循环语句处理“BookList”节点,第11行的循环语句处理“Book”元素。第02行至第10行绘制表头,第12行至第19行绘制表格数据单元格,并将书名、作者等XML元素内容填充到表格单元格中。

6.7元素排序

排序可以为XSLT中输出的记录建立规则,使得经过XSLT转换后的XML数据输出变得有规则。XSL中使用<xsl:sort>进行排序处理,将若干记录按一定顺序输出。

【例6-14】

案例名称:使用<xsl:sort>对ch6-4.xml文档内容进行排序输出。程序名称:ch6-14.xsl

01<?xmlversion="1.0"encoding="UTF-8"?>

02<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

03<xsl:templatematch="/">

04<html>

05<head><title>图书信息简介</title></head>

06<body>

07<xsl:apply-templatesselect="BookList"/>

08</body>09</html>

10</xsl:template>

11<xsl:templatematch="BookList">

12<tablewidth="650"align="center"cellpadding="1"cellspacing="1">

13<trbgcolor="#c0c060">

14<th>书名</th>

15<th>作者</th>

16<th>出版社</th>

17<th>出版日期</th>18<th>ISBN</th>

19<th>类别</th>

20</tr>

21<xsl:apply-templatesselect="Book">

22<xsl:sortselect="@Category"order="descending"/>

23</xsl:apply-templates>

24</table>

25</xsl:template>

26<xsl:templatematch="Book">

27<trbgcolor="#ffffc0">28<td><xsl:value-ofselect="Title"/></td>

29<td><xsl:value-ofselect="Author"/></td>

30<td><xsl:value-ofselect="Publisher"/></td>

31<td><xsl:value-ofselect="PubDate"/></td>

32<td><xsl:value-ofselect="ISBN"/></td>

33<td><xsl:value-ofselect="@Category"/></td>

34</tr>

35</xsl:template>

36</xsl:stylesheet>案例分析:例6-14第22行<xsl:sortselect="@Category"order="descending"/>对Book元素按类别“Category”降序输出。如果需要升序输出,则修改order的值为ascending。如果存在一个以上的<xsl:sort>元素,则输出内容先按第一关键字排序,然后再按第二关键字排序,依次类推。

6.8综合实例

本节综合使用XSLT技术编写一个图书信息查询页面,查询页面分为两个功能页面:图书简要信息显示页面和图书详细信息显示页面。图书简要信息显示页面列表显示图书的简要内容,如书名、作者、出版社、出版时间、定价和图书类别。图书简要信息显示页面要提供查询图书具体信息的超链接。图书简要信息显示页面如图6-7所示。图6-7图书简要信息列表显示页面图书详细信息显示页面包含图书内容简介和图书封面,如图6-8所示。详细显示页面需要提供一个“返回”链接,可以从详细内容显示页面返回到简要信息列表页面。图6-8图书详细信息显示页面

【例6-15】

案例说明:图书信息查询使用BookList.xml存储图书简要信息,使用Book1.xml、Book2.xml、Book3.xml和Book4.xml存储4本图书的详细信息。程序BookList.xsl将BookList.xml文档转换为图6-7所示图书简要信息列表。程序BookDetail.xsl可以分别将4个存储图书详细信息的文档转换为图6-8所示页面。程序名称:bookList.xml

01<?xmlversion="1.0"encoding="UTF-8"?>

02<?xml-stylesheettype="text/xsl"href="bookList.xsl"?>

03<Library>

04<CategoryType="计算机">

05<Bookid="1">

06<Title>软件系统开发技术(修订版)</Title>

07<Author>潘锦平,施小英,姚天昉</Author>

08<PubInfo>09<Publisher>西安电子科技大学出版社</Publisher>

10<PubDate>2002-01-01</PubDate>

11<ISBN>7-5606-0492-7</ISBN>

12<Price>16.00</Price>

13</PubInfo>

14<HLink>

15<LinkID>Book1.xml</LinkID>

16<LinkName>详细</LinkName>

17</HLink>

18</Book>

19<Bookid="2">20<Title>软件工程(第二版)</Title>

21<Author>邓良松,刘海岩,陆丽娜</Author>

22<PubInfo>

23<Publisher>西安电子科技大学出版社</Publisher>

24<PubDate>2004-09-01</PubDate>

25<ISBN>7-5606-0924-4</ISBN>

26<Price>22.00</Price>

27</PubInfo>

28<HLink>29<LinkID>Book2.xml</LinkID>

30<LinkName>详细</LinkName>

31</HLink>

32</Book>

33</Category>

34<CategoryType="小说">

35<Bookid="3">

36<Title>基督山伯爵(上下册)</Title>

37<Author>大仲马(法)</Author>

38<PubInfo>39<Publisher>上海译文出版社</Publisher>

40<PubDate>2001-08-01</PubDate>

41<ISBN>7-5327-2651-7</ISBN>

42<Price>38.00</Price>

43</PubInfo>

44<HLink>

45<LinkID>Book3.xml</LinkID>

46<LinkName>详细</LinkName>

47</HLink>

48</Book>

49<Bookid="4">50<Title>诸葛孔明</Title>

51<Author>陈舜臣</Author>

52<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论