代码之家  ›  专栏  ›  技术社区  ›  user3111525

如何在xquery中基于属性对元素进行分组?

  •  3
  • user3111525  · 技术社区  · 14 年前

    我有这个xml:

    <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>
    

    我真正想做的是,对于每个a,我需要将元素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>
    ...
    ...
    ...
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   user357812user357812    14 年前

    这个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>
    
        2
  •  1
  •   Dennis Münkle    14 年前

    如果您的处理器支持XQuery1.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/