科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件筛选和排序XML数据

筛选和排序XML数据

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在接下来的两节中,你将学习利用XSL 样式表来筛选和排序XML 数据的基本方法。然后,你将看到某些范例样式表,示范筛选和排序的方法。

作者: 来源:中国软件网 2008年6月23日

关键字: 排序 筛选 XML 软件

  • 评论
  • 分享微博
  • 分享邮件
 在接下来的两节中,你将学习利用XSL 样式表来筛选和排序XML 数据的基本方法。然后,你将看到某些范例样式表,示范筛选和排序的方法。

筛选

    你已经了解,指定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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章