3.测试模式:
在该模式中包括<xsl:if> 和<xsl:when>等语句。
前面曾经介绍过:XML技术的优势之一就在于数据输出时的可选择性,即选择需要的数据进行显示输出。前面我们所讲到的选择模式语句:<xsl:for-each>、<xsl:value-of>及匹配模式语句<xsl: template>只是简单的选取通过“/”符号层层到达的节点,那么如果我们对XML数据不需要全部输出,而只需要满足某条件的部分数据,就需要使用条件判断<xsl:if>与多条件判断<xsl:choose>及<xsl:when>等语句,其使用方式与传统的程序设计语言中的流程控制同样是类似的。
<xsl:if>的语法结构如下:
<xsl:if expr="script-expression" language="language-name" test="pattern">
其中,expr 属性用于设置脚本语言表达式,其计算结果为“真”或者“假”;如果计算结果为“真”,且通过test属性所设置的对原始数据的测试条件,则在输出中显示其中的内容(该属性可以省略)。
language属性用于设置expr属性中表达式的脚本语言类型,其取值与HTML标记script的language属性的取值相同,缺省为“JavaScript”。
test 属性用于指定对原始数据进行测试的条件。
下面通过一个实例进行说明,依然是针对前面案例中的template.xml文档,针对该文档采用XSTL中的模版以及<xsl:if>语句对其进行显示控制,对应的样式文件名称为“if.xsl”。注意修改XML文档中与设置样式文件位置和名称相关的语句。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!--
根模版
-->
<xsl:template match="/">
<html>
<head>
<title>
学生成绩
</title>
</head>
<body>
<xsl:apply-templates select="classmates/student" />
</body>
</html>
</xsl:template>
<!--
主体模版
-->
<xsl:template match="student">
<table border="1" cellspacing="0">
<th>
学号
</th>
<th>
姓名
</th>
<th>
成绩
</th>
<tr>
<td>
<xsl:value-of select="sid" />
</td>
<td>
<xsl:value-of select="sname" />
</td>
<td>
<xsl:apply-templates select="toefl" />
</td>
</tr>
</table>
</xsl:template>
<xsl:template match="toefl">
<xsl:if test=".[value()$le$650]">
<xsl:attribute name="style">color:red</xsl:attribute>
</xsl:if>
<xsl:value-of />
</xsl:template>
</xsl:stylesheet>
对应实现的效果如图3-32所示,可以看到托福成绩低于650的成绩以红色进行了显示。
图
3-32
进行显示控制之后的效果
在上面的例子中,$le$是关系运算符中的“小于等于”,对应的其他关系有小于($lt$)、大于($gt$)、大于等于($ge$)、等于($eq$)、不等于($ne$)等。“. ”表示引用当前标记,本例中为“toefl”,[ ]表示筛选,只有满足筛选条件的标记才能适用于对应的显示控制。value() 是XSTL中的函数,其他常用的函数还有text()、end()、index()等等。
如果我们希望对同一数据同时测试多个条件,根据不同条件输出相应结果。那么除了使用<xsl:if>语句之外,也可以使用<xsl:choose>语句,该语句的语法如下:
<xsl:choose>
<xsl:when expr="script-expression" language="language-name" test="pattern">
<xsl:otherwise>
其中<xsl:choose>表示一个多路选择分支的开始。<xsl:when>语句中相关属性的含义与<xsl:if>类似,这里不在赘述。<xsl:otherwise>表示如果有不满足<xsl:when>规定的条件,则按照此标记中的内容进行输出。
下面依然通过一个实例进行说明,针对前面案例中的
template.xml
文档,针对该文档采用
XSTL
中的模版以及
<xsl:choose>
语句对其进行显示控制,对应的样式文件名称为“
choose.xsl
”,注意修改XML文档中与设置样式文件位置和名称相关的语句。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!--
根模版
-->
<xsl:template match="/">
<html>
<head>
<title>
学生成绩
</title>
</head>
<body>
<xsl:apply-templates select="classmates/student" />
</body>
</html>
</xsl:template>
<!--
主体模版
-->
<xsl:template match="student">
<table border="1" cellspacing="0">
<th>
学号
</th>
<th>
姓名
</th>
<th>
托福成绩
</th>
<tr>
<td>
<xsl:value-of select="sid" />
</td>
<td>
<xsl:value-of select="sname" />
</td>
<td>
<xsl:apply-templates select="toefl" />
</td>
</tr>
</table>
</xsl:template>
<xsl:template match="toefl">
<xsl:choose>
<xsl:when test=".[value()$ge$700]">
优秀</xsl:when>
<xsl:when test=".[value()$gt$600]">
一般</xsl:when>
<xsl:when test=".[value()$gt$500]">
及格</xsl:when>
<xsl:otherwise>
不及格</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
对应实现的效果如图3-33所示,可以看到托福成绩根据实际的分数依据不同的评价等级进行了显示。
最后再通过两个实例介绍,如何综合使用上面介绍的相关语句实现对前面XML文件的
显示。例如,我们针对
xml1.xml
文件中的数据,配合对应的
XSTL
实现对应数据信息的显示,
图
3-33
进行显示控制之后的效果
将对应的文件进行复制,得到xml2.xml。在项目“P35_XML”中新建一个XSTL文件,名称为xml2.xsl,对应的样式文件中样式的设置为:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<center>
<table border="1">
<tr>
<td>
学号
</td>
<td>
姓名
</td>
<td>GRE
成绩
</td>
</tr>
<xsl:for-each select="classmates/student">
<tr>
<td>
<xsl:value-of select="sid" />
</td>
<td>
<xsl:value-of select="sname" />
</td>
<td>
<xsl:value-of select="gre" />
</td>
</tr>
</xsl:for-each>
</table>
</center>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
然后在原有的
xml2.xml
文件中添加新的一行如下所示,该行用于指定所需使用的样式表文件的类型、位置以及名称。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xml2.xsl"?>
<classmates>
<student>
<sid>1</sid>
<sname>
张桂元
</sname>
<gre>1700</gre>
<toefl>630</toefl>
<tse>120</tse>
</student>
……
此时,在浏览器中再次直接打开
xml1.xml
文件的效果如图
3-34
所示。可以看到树型结构中的数据已经以表格的形式进行了相应的显示。
图
3-34
浏览器中配合
XSLT
显示
XML
文档的效果
下面再给出一个实现效果更加复杂的例子,在项目中新建一个XML的文档,名称为xml3.xml,在该文档中存储的是相关下载软件的列表信息,对应的文档内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="xml3.xsl" ?>
<
搞笑中心软件店
>
<
说明
>
此测试页使用
XML
语言制作,必须使用
IE5.0
或以上版本才能正常浏览
.</
说明
>
<
软件列表
>
<
软件
>
<
序号
>1</
序号
>
<
名称
>Goodnight
歌
</
名称
>
<
作恶度
>--</
作恶度
>
<
搞笑度
>
*
*
*
*
</
搞笑度
>
<
大小
>633k</
大小
>
<
介绍
>
这不是恶作剧软件,但却是一首很好听的歌,动画也很有趣,建议送给
baby
。
</
介绍
>
<
网址
>../main/soft/011goodnight.exe</
网址
>
</
软件
>
<
软件
>
<
序号
>2</
序号
>
<
名称
>
搞怪鼠标(
3
)
</
名称
>
<
作恶度
>
*
*
</
作恶度
>
<
搞笑度
>
*
</
搞笑度
>
<
大小
/>
<
介绍
>
使鼠标突然变大。
</
介绍
>
<
网址
>../main/soft/024vigor.zip</
网址
>
</
软件
>
<
软件
>
<
序号
>3</
序号
>
<
名称
>
模拟电话拨号程序
</
名称
>
<
作恶度
>
*
*
*
*
</
作恶度
>
<
搞笑度
>
*
*
*
*
</
搞笑度
>
<
大小
>70k</
大小
>
<
介绍
>
铃
,
铃
.....
电话响了
,
听听是谁来的电话
!</
介绍
>
<
网址
>../main/soft/051ringing.zip</
网址
>
</
软件
>
<
软件
>
<
序号
>4</
序号
>
<
名称
>
电脑升级
</
名称
>
<
作恶度
>
*
*
*
</
作恶度
>
<
搞笑度
>
*
*
*
</
搞笑度
>
<
大小
>23k</
大小
>
<
介绍
>
经过这次软升级
,
可使你的内存效率提高
16
倍
,
硬盘效率提高
10
倍
!(
运行前
c
盘根目录下要有一个
320x400,256
色的
bmp
图像
,
文件名
logo.sys,
不然会出错
)</
介绍
>
<
网址
>../main/soft/052level.zip</
网址
>
</
软件
>
</
软件列表
>
<
版权说明
>
搞笑中心软件店版权所有
</
版权说明
>
</
搞笑中心软件店
>
可以看到,这是一个标准的
XML
文档,特殊之处在于在该文档中使用了中文的标记名称。下面我们配合使用XSTL样式文件控制对应内容的显示。新建一个文件,名称为xml3.xsl,对应的样式内容如下:
<?xml version="1.0" encoding="GB2312" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<br>
<b>
<div align="center">
<font color="#00aaaa">
趣味软件大全
</font>
</div>
</b>
</br>
<table border="1" cellpadding="1" cellspacing="1" width="760" align= "center">
<tr>
<th width="80" align="left">
序号
</th>
<th>
名称
</th>
<th>
作恶度
</th>
<th>
搞笑度
</th>
<th>
大小
</th>
</tr>
<xsl:for-each select="
搞笑中心软件店
/
软件列表
/
软件
">
<tr>
<td>
<b>
<xsl:value-of select="
序号
" />
</b>
</td>
<td>
<font color="#ff0000">
<xsl:value-of select="
名称
" />
</font>
</td>
<td>
<xsl:value-of select="
作恶度
" />
</td>
<td>
<xsl:value-of select="
搞笑度
" />
</td>
<td>
<xsl:value-of select="
大小
" />
</td>
</tr>
<tr>
<th>
介绍
:</th>
<td colspan="4">
<xsl:value-of select="
介绍
" />
</td>
</tr>
<tr>
<td colspan="5" align="right">
<a target="_blank">
<xsl:attribute name="href">
<xsl:value-of select="
网址" />
</xsl:attribute>
按此下载
</a>
</td>
</tr>
</xsl:for-each>
</table>
<p align="center">
<xsl:value-of select="
搞笑中心软件店
/
版权说明
" />
</p>
</xsl:template>
</xsl:stylesheet>
注意在该例中实现超级链接的方式时,所使用的<xsl:attribute>标记。对应XML文档在页面中的显示效果如图3-35所示。
图
3-35
浏览器中配合
XSLT
显示
XML
文档的效果