新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> Oracle, SQL Server与XML,XML在数据挖掘中的应用, PMML.
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 XML 与 数据库 』 → 筛选和排序XML数据 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6073 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 筛选和排序XML数据 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     goodyu 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:8
      积分:112
      门派:XML.ORG.CN
      注册:2006/8/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给goodyu发送一个短消息 把goodyu加入好友 查看goodyu的个人资料 搜索goodyu在『 XML 与 数据库 』的所有贴子 引用回复这个贴子 回复这个贴子 查看goodyu的博客楼主
    发贴心情 筛选和排序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="http://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="http://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)


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/8/13 9:53:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML 与 数据库 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/27 21:36:24

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms