«December 2025»
123456
78910111213
14151617181920
21222324252627
28293031


公告
暂无公告...

我的分类(专题)

首页(9)
.net XML(1)
XSLT(2)
七嘴八舌XML(1)


最新日志
XSLT2.0新特性体验之一——分组的简
Eclipse+Lomboz+Tomca
哎,又走了一个....
郁闷,又是.net和java的比较,不过
花了两个小时折腾一个分页
在.net中验证XML
今天走出校门整四个月.....
空格问题
一点想法

最新回复
回复:Eclipse+Lomboz+To
回复:哎,又走了一个....
回复:郁闷,又是.net和java的比较

留言板
签写新留言

求助

统计
blog名称:
日志总数:9
评论数量:4
留言数量:1
访问次数:72857
建立时间:2004年11月2日

链接




W3CHINA Blog首页    管理页面    写新日志    退出

[XSLT]XSLT2.0新特性体验之一——分组的简化[原创]
doubleG 发表于 2005/3/30 17:15:51

 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="' target=_blank>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"/>&#160;  </xsl:for-each>  <br/>  The b:  <xsl:for-each select="./node[generate-id(.)=generate-id(key('nodeB',@b))]">   <xsl:value-of select="@b"/>&#160;   </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(.)"/>&#160; <xsl:value-of select="generate-id(key('nodeA',@a))"/> <br/></xsl:for-each>可以看到输出值是IDAWHIYF  IDAWHIYFIDAZHIYF  IDAZHIYFIDA2HIYF  IDAZHIYFIDATGIYF  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="' target=_blank>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"/>>&#160;  </xsl:for-each-group>  <br/>  The b:  <xsl:for-each-group select="node" group-by="@b">   <xsl:value-of select="@b"/>>&#160;  </xsl:for-each-group> </xsl:template></xsl:stylesheet> 只是使用了一个语句:for-each-group 通过group-by属性就将数据进行了分组,和SQL中的group-by很像对吗?它本身还有一些属性设置,往后再一一道来。 这篇文章的目的告诉大家,虽然xslt2.0的内容多了,但是对于一些操作确是简化了不少:)

阅读全文(2330) | 回复(0) | 编辑 | 精华


发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)
站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144803559 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号