2010-11-18 117 views
3

我有这样的XML:如何根据xquery中的属性对元素进行分组?

<all> 
    <a> 
     <b x="i" al="kl"/> 
     <b x="j" al="ml"/> 
     <b x="k" al="jl"/> 
     <b x="j" al="pl"/> 
     <b x="j" al="il"/> 
     <b x="i" al="dl"/> 
    </a> 
    <a> 
     <b x="i1" al="kl"/> 
     <b x="j2" al="ml"/> 
     <b x="k3" al="jl"/> 
     <b x="j2" al="pl"/> 
     <b x="j2" al="il"/> 
     <b x="i3" al="dl"/> 
    </a> 
</all> 

我真正想要做的是为每一个我需要组元素b。通过@x。所以,结果是这样的:

<a x="j"> 
<b x="j" l="ml"/> 
<b x="j" l="pl"/> 
... 
</a> 
<a x="i"> 
    <b x="i" al="kl"/> 
    <b x="i" al="dl"/> 
</a> 
... 
... 
... 

回答

4

这XQuery的:

element result { 
    for $a in /all/a 
    return for $x in ($a/b/@x)[index-of($a/b/@x,.)[1]] 
      return element a { 
        $x, 
        $a/b[@x eq $x] 
       } 
} 

输出:

<result> 
    <a x="i"> 
     <b x="i" al="kl"/> 
     <b x="i" al="dl"/> 
    </a> 
    <a x="j"> 
     <b x="j" al="ml"/> 
     <b x="j" al="pl"/> 
     <b x="j" al="il"/> 
    </a> 
    <a x="k"> 
     <b x="k" al="jl"/> 
    </a> 
    <a x="i1"> 
     <b x="i1" al="kl"/> 
    </a> 
    <a x="j2"> 
     <b x="j2" al="ml"/> 
     <b x="j2" al="pl"/> 
     <b x="j2" al="il"/> 
    </a> 
    <a x="k3"> 
     <b x="k3" al="jl"/> 
    </a> 
    <a x="i3"> 
     <b x="i3" al="dl"/> 
    </a> 
</result> 
+0

很好的回答,+1。 – 2010-11-18 23:48:20

+0

感谢您的工作示例,Alejandro。当然,回答。 – user3111525 2010-11-19 09:26:40

+0

@ user322034:你好。 – 2010-11-19 12:26:22

1

如果您的处理器支持的XQuery 1.1,你可以简单地使用group by

let $all := 
    <all> 
    <a> 
     <b x="i" al="kl"/> 
     <b x="j" al="ml"/> 
     <b x="k" al="jl"/> 
     <b x="j" al="pl"/> 
     <b x="j" al="il"/> 
     <b x="i" al="dl"/> 
    </a> 
    <a> 
     <b x="i1" al="kl"/> 
     <b x="j2" al="ml"/> 
     <b x="k3" al="jl"/> 
     <b x="j2" al="pl"/> 
     <b x="j2" al="il"/> 
     <b x="i3" al="dl"/> 
    </a> 
    </all> 
for $a in $all/a 
for $b in $a/b 
let $x := string($b/@x) 
group by $x 
order by $x 
return 
    <a x="{$x}"> 
    {$b} 
    </a> 

你可以在http://try.zorba-xquery.com/上执行此代码

+0

+1对于在线XQuery测试链接。 – 2010-11-18 22:37:01

+0

我正在使用Saxon,它目前需要group-by表达式才能拥有单个for子句,单个let子句和单个group-by子句。不过谢谢你的回答。 +1。 – user3111525 2010-11-19 09:07:12

相关问题