扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
筛选
你已经了解,指定match 或select 属性的值是样本,该样本会对应到XML 文件中的一个或多个元素。(你可以使用template 元素的match 属性,value-of、for-each 和apply-templates 元素的select 属性,来达到相同的目的。)截至目前为止你所见过的样本,都只包含一个路径运算子,而此路径运算子指定了元素名称,可能也指定了一个以上的父元素名称。你可以更进一步地限制样本对应到元素的个数,并藉由在路径运算子后加入一个筛选运算子,此筛选运算子以中括号([])表示。例如,下面指定到match 属性的样本指出一个对应元素,名称为BOOK,而且它必须包含一个拥有文字「trade paperback」的BINDIN 子元素:
简单地在筛选运算子中加入一个元素名称,使对应到的元素皆具有此子元素。例如,下面所示的样本,对应到任何具有子元素CD 的ITEM 元素,不用考虑子元素CD 中的内容:
match="ITEM [CD]"
接下来的样本,对应到任何具有COLOR 子元素的SHIRT 元素,而且子元素COLOR 还须符合具有文字「red」的条件:
match="SHIRT [COLOR=''red'']"
相反地,下面的样本对应到任何具有子元素COLOR 的SHIRT 元素,而且子元素COLOR 还须符合不具有文字「red」的条件:
select="SHIRT [COLOR!=''red'']"
注意
如果元素拥有多个子元素,这些子元素的名称皆符合筛选运算子中指定的筛选条件时,则样本的比较运算子将只适用于第一个符合条件的子元素。例如,如果SHIRT 元素拥有两个子COLOR元素,样本"SHIRT[COLOR=''red'']"将只对应到第一个具有文字「red」的COLOR 子元素。
排序
在此章中,你已看到可以使用for-each 和apply-templates 两个元素来处理重复元素。你可以使用这些元素的order-by 属性来控制浏览器处理这些元素的顺序,藉以排序显示的XML 资料。
你可以藉由分号的使用,来将order-by 属性设定成一个以上的样本,以分号区隔。浏览器将使用样本排列的顺序来排序这些元素。你可以在每个样本前加上符号「+」或「-」,来指定是递增或递减排序。
例如,下面for-each 元素的order-by 属性设定会使得浏览器以作者的姓来递增排序BOOK 元素,而当具有相同姓时,则以名字来递增排序:
<xsl:for-each select="INVENTORY/BOOK"order-by="+AUTHOR/LASTNAME;+AUTHOR/FIRSTNAME">
下面则为另一个范例,范例中属性order-by 的设定,将以书名来递减排序BOOK 元素:
<xsl:apply-templates select="INVENTORY/BOOK" order-by="-TITLE">
在属性order-by 中指定的路径运算子,是相对于select 属性中指定样本的相对位置。因此,在这个范例中,属性order-by 设定为「-TITLE」,对应到元素INVENTORY 的子元素BOOK 中的TITLE 元素
进行筛选和排序的样式表范例
本节提出两个XSL 样式表范例,由列表10-6 和10-7 提供。这些范例将显示筛选和排序BOOK元素的结果。你可以在随书光盘的 XslDemo04.xsl 和 XslDemo05.xsl 档案中找到。
XslDemo04.xsl
<?xml version="1.0"?>
<!--File Name:XslDemo04.xsl-->
<xsl:stylesheet xmlns:xsl="ttp://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<H2>Book Inventory</H2>
<xsl:for-each
select="INVENTORY/BOOK [BINDING=''trade
paperback'']"
order-by="+AUTHOR/LASTNAME;+AUTHOR/FIRSTNAME">
<SPAN STYLE="font-style:italic">Author:</SPAN>
<xsl:value-of select="AUTHOR"/><BR/>
<SPAN STYLE="font-style:italic">Title:</SPAN>
<xsl:value-of select="TITLE"/><BR/>
<SPAN STYLE="font-style:italic">Binding
type:</SPAN>
<xsl:value-of select="BINDING"/><BR/>
<SPAN STYLE="font-style:italic">Number of
pages:</SPAN>
<xsl:value-of select="PAGES"/><BR/>
<SPAN STYLE="font-style:italic">Price:</SPAN>
<xsl:value-of select="PRICE"/><P/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
列表10-6.
XslDemo05.xsl
<?xml version="1.0"?>
<!--File Name:XslDemo05.xsl -->
<xsl:stylesheet xmlns:xsl="ttp://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<H2>Book Inventory</H2>
<xsl:apply-templates select="INVENTORY/BOOK"
order-by="+AUTHOR/LASTNAME;+AUTHOR/FIRSTNAME"/>
</xsl:template>
<xsl:template match="BOOK [BINDING=''trade paperback'']">
<SPAN STYLE="font-style:italic">Author:</SPAN>
<xsl:value-of select="AUTHOR"/><BR/>
<SPAN STYLE="font-style:italic">Title:</SPAN>
<xsl:value-of select="TITLE"/><BR/>
<SPAN STYLE="font-style:italic">Binding type:</SPAN>
<xsl:value-of select="BINDING"/><BR/>
<SPAN STYLE="font-style:italic">Number of pages:</SPAN>
<xsl:value-of select="PAGES"/><BR/>
<SPAN STYLE="font-style:italic">Price:</SPAN>
<xsl:value-of select="PRICE"/><P/>
</xsl:template>
</xsl:stylesheet>
这两个样式表范例,都是设计被连结至列表10-4 的XML 文件(XslDemo.xml)。两者都使用下面的筛选运算子,使得浏览器只显示BINDING 子元素具有文字「trade paperback」的元素:
[BINDING=''trade paperback'']
而且这些范例都使用下面的order-by 属性设定,以作者的姓来递增排序BOOK 元素,如作者的姓相同时,再以作者的名字来递增排序:
order-by="+AUTHOR/LASTNAME;+AUTHOR/FIRSTNAME"
下图为则为两个范例相同输出结果的第一部份:
列表10-6 中的样式表,使用for-each 元素来显示多个BOOK 元素。在下面的样式表中,筛选运算子和order-by 属性皆被加入for-each 元素中。
<xsl:for-each
select="INVENTORY/BOOK [BINDING=''trade paperback'']"
order-by="+AUTHOR/LASTNAME;+AUTHOR/FIRSTNAME">
<!--display current BOOK element-->
</xsl:for-each>
列表10-7 中的样式表,使用apply-templates 元素及对应BOOK 元素的个别样板,来显示多个BOOK 元素。在样式表中,筛选运算子被加入对应到BOOK 元素的样板中:
<xsl:template match="BOOK [BINDING=''trade paperback'']">
将筛选运算子加入apply-templates 元素中,也会得到相同的效果:
order-by 属性以下面的格式被加入apply-templates 元素中:
<xsl:apply-templates select="INVENTORY/BOOK"order-by="+AUTHOR/LASTNAME;+AUTHOR/FIRSTNAME"/>
order-by 属性必须被加入到apply-templates 元素中,因为template 元素无法辨识order-by 属性。 (你只可以在一个元素中使用属性order-by,使得浏览器在多重元素中搜寻符合的数据,这些元素就是for-each 和apply-templates)
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者