2010-11-18 115 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

相關問題