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

    >> 本版讨论XSL,XSLT,XSL-FO,CSS等技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XSL/XSLT/XSL-FO/CSS 』 → XSLT2.0新特性体验之一——分组的简化[原创] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 47451 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: XSLT2.0新特性体验之一——分组的简化[原创] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     doubleG 帅哥哟,离线,有人找我吗?
      
      
      威望:7
      等级:大三(面向对象是个好东东!)
      文章:591
      积分:4119
      门派:XML.ORG.CN
      注册:2004/5/27

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给doubleG发送一个短消息 把doubleG加入好友 查看doubleG的个人资料 搜索doubleG在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看doubleG的博客楼主
    发贴心情 XSLT2.0新特性体验之一——分组的简化[原创]

    XSLT2.0已经出来时间不短了,由于时间关系一直没有好好去看,最近抽点时间和大家一起讨论一下喽:)
    XSLT2.0相比1.0增加了五个比较激动人心的功能
    今天就来看看第一个:支持分组了。在1.0中我们要对XML分组虽然可以使用很多方式,但是就算最出名的Muenchian虽然灵巧但是其复杂耗内存的方法并不受人们的推崇,在2.0中有了直接的支持,使得XML中的分组不再令人生畏,下面我们就来比较一下1.0和2.0中的分组:
    数据文件:node.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <?xml:stylesheet type="text/xsl" href="1.xsl"?>
    <root>
     <node a="a1" b="b1"/>
     <node a="a2" b="b1"/>
     <node a="a2" b="b2"/>
     <node a="a3" b="b2"/>
    </root>
    目标结果输出:
    The a: a1  a2  a3  
    The b: b1  b2  


    在1.0中没有直接的分组功能必须自己想办法来进行处理,我就拿Muenchian方法来做例子了(毕竟是最灵巧的方法,呵呵)
    1.xsl(1.0版):
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
     <xsl:key name="nodeA" match="node" use="@a"/>
     <xsl:key name="nodeB" match="node" use="@b"/>
     <xsl:template match="root">
      The a:
      <xsl:for-each select="./node[generate-id(.)=generate-id(key('nodeA',@a))]">
       <xsl:value-of select="@a"/> 
      </xsl:for-each>
      <br/>
      The b:
      <xsl:for-each select="./node[generate-id(.)=generate-id(key('nodeB',@b))]">
       <xsl:value-of select="@b"/> 

      </xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>

    设定两个key值,一个名字为nodeA,一个为nodeB。他们分别都是对于node这个节点进行分组设定的,只是分组所使用的内容不同,nodeA使用的是node的a属性,nodeB使用的是b属性。
    generate-id(node-set):
    The generate-id function returns a string that uniquely identifies the node in the argument node-set that is first in document order.
    该函数会返回节点在整个文档中的唯一标识。
    node-set key(string, object)
    第一个参数是key名字,就是前面定义的<xsl:key的名字,object表示那个内容和key中的内容进行匹配,key('nodeA',@a)就是返回了第一个和当前节点的匹配内容相同的文档中的节点。
    在上述的xsl中,我们添加进这样一段
    <xsl:for-each select="./node">
     <xsl:value-of select="generate-id(.)"/> 
     <xsl:value-of select="generate-id(key('nodeA',@a))"/>
     <br/>
    </xsl:for-each>
    可以看到输出值是
    IDAWHIYF  IDAWHIYF
    IDAZHIYF  IDAZHIYF
    IDA2HIYF  IDAZHIYF
    IDATGIYF  IDATGIYF
    可以看到空格前的四个数据是完全不相同的,也就是每一个节点的唯一标示,使随机生成并没有固定值,但空格后的数据第二个和第三个是相同的。我们可以看一下xml数据的第二个和第三个节点:
    <node a="a2" b="b1"/>
    <node a="a2" b="b2"/>
    他们的a属性是相同,所以说明key('nodeA',@a)在处理到第三个节点<node a="a2" b="b2"/>时返回的是符合key的第一个节点,也就是<node a="a2" b="b1"/>。
    通过这种"./node[generate-id(.)=generate-id(key('nodeA',@a))]"方式就剔除重复的内容,达到了分组效果,解析结果就是:
    The a: a1  a2  a3  
    The b: b1  b2  

    是不是很复杂啊,xslt2.0解决了这个难题,我们看一下2.0的程序:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes">
     <xsl:output method="html"/>
     <xsl:template match="root">
      The a:
      <xsl:for-each-group select="node" group-by="@a">
       <xsl:value-of select="@a"/>> 
      </xsl:for-each-group>
      <br/>
      The b:
      <xsl:for-each-group select="node" group-by="@b">
       <xsl:value-of select="@b"/>> 
      </xsl:for-each-group>
     </xsl:template>
    </xsl:stylesheet>


    只是使用了一个语句:for-each-group 通过group-by属性就将数据进行了分组,和SQL中的group-by很像对吗?它本身还有一些属性设置,往后再一一道来。

    这篇文章的目的告诉大家,虽然xslt2.0的内容多了,但是对于一些操作确是简化了不少:)


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/30 17:13:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/28 17:54:17

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

     *树形目录 (最近20个回帖) 顶端 
    主题:  XSLT2.0新特性体验之一——分组的简化[原创](3771字) - doubleG,2005年3月30日
        回复:  支持,经验是就重要的。呵呵。。。。。(36字) - cthily,2006年3月23日
        回复:  good(4字) - zkj8421,2005年11月27日
        回复:  很好很好。(10字) - kevinxu,2005年10月25日
        回复:  原来如此 group-by 是2.0提供的上次在1.0下调试怎么都不行..(58字) - 一叶千鸟,2005年8月7日
        回复:  谢谢了,希望与更多的后继内容,(30字) - lazyy,2005年7月9日
        回复:  楼主的文章非常好,不过其中有几个小问题。一个是关于key函数的解释:node-set key(..(1333字) - wzzwj,2005年7月9日
        回复:  请问楼主,知道哪几个解析器支持XSLT2.0吗?谢谢,不知道IE6.0中的MSXML3.0支持..(89字) - smxwjd,2005年7月4日
            回复:  XMLSpy 2005是支持XSLT 2.0 的[quote][b]以下是引用[i]smxwj..(198字) - admin,2005年7月5日
        回复:  XLST 多文件输出,不知道楼主有没有此类资料或代码?Thank You^_^..(63字) - smxwjd,2005年7月1日
            回复:  [quote][b]以下是引用[i]smxwjd在2005-7-1 21:14:57[/i]的发言..(226字) - Qr,2005年7月2日
        回复:  我还要看XSLT2.0其他内容望提供Thank you!(45字) - chenshijun,2005年6月24日
        回复:  不错!我还想知道一下XSL2的其他情况!!(38字) - jx27,2005年6月21日
        回复:  让admin给你 精 一下(19字) - sam,2005年4月1日
        回复:  很好很好~加油加油!!(22字) - 殷千炀,2005年3月31日
        回复:  55555~~~~~ 我写的东西总是没人看,失败啊。哪里写的不好也要提出来啊,不然都没有兴趣写了。..(127字) - doubleG,2005年3月31日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    3,375.000ms