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文档的效果