xquery组按字母顺序命名以创建联系人列表

时间:2012-02-23 20:36:02

标签: xml group-by xquery

我有一个带入口元素的xml。每个条目都有一个作者。我试图以这样的方式对条目进行分组,使得每个组由作者姓名以唯一字母字符开头的条目组成。作者姓名以字母'a'开头的所有条目应该在一个组中,名称以字母'b'开头的作者的所有条目应该在另一个组中,依此类推。

let $feeds := 
  <feed>
     <entry>
       <author>a</author>
       <title>Title a</title>
     </entry>
     <entry>
       <author>b</author>
       <title>Title ba</title>
     </entry>
     <entry>
       <author>ab</author>
       <title>Title ab</title>
     </entry>
     <entry>
       <author>bb</author>
       <title>Title bb</title>
     </entry>
   </feed>
for $entry in $feeds/entry
  let $author := $entry/author
  order by $author ascending
    return
      $entry

返回结果:

<entry>
  <author>a</author>
  <title>Title a</title>
</entry>, <entry>
  <author>ab</author>
  <title>Title ab</title>
</entry>, <entry>
  <author>b</author>
  <title>Title ba</title>
</entry>, <entry>
  <author>bb</author>
  <title>Title bb</title>
</entry>

我正在尝试调整代码,以便返回的结果看起来像这样:

<group>
<author-group>
<entry>
  <author>a</author>
  <title>Title a</title>
</entry>, <entry>
  <author>ab</author>
  <title>Title ab</title>
</entry>
</author-group>
<author-group>
<entry>
  <author>b</author>
  <title>Title ba</title>
</entry>, <entry>
  <author>bb</author>
  <title>Title bb</title>
</entry>
</author-group>
<group>

在我的示例中,需要两个作者组 - 第一作者组,其名称以a开头的所有作者组成,第二作者组由名称以b开头的所有作者组成

我想忽略作者姓名中的案例,即aa和Aa被视为相同。

然后,我会将每个作者组创建一个联系人列表。

谢谢, 索尼

2 个答案:

答案 0 :(得分:1)

这是一个XQuery 1.0解决方案:

let $feeds :=  
  <feed> 
     <entry> 
       <author>a</author> 
       <title>Title a</title> 
     </entry> 
     <entry> 
       <author>b</author> 
       <title>Title ba</title> 
     </entry> 
     <entry> 
       <author>Ab</author> 
       <title>Title ab</title> 
     </entry> 
     <entry> 
       <author>Bb</author> 
       <title>Title bb</title> 
     </entry> 
   </feed>
return
<group>{
  for $initial in distinct-values($feeds/entry/author/lower-case(substring(.,1,1)))
        order by $initial
  return
    <author-group>{
      for $entry in $feeds/entry[author/lower-case(substring(.,1,1)) eq $initial]
      let $author := $entry/author 
      order by $author ascending
      return
        $entry
    }</author-group>
}</group>

HTH

答案 1 :(得分:1)

此XQuery转换

 <groups> 
 {
 let $entries := /*/entry,

  $vals := $entries/author/lower-case(substring(.,1,1))
      return
         for $fst in  $vals[index-of($vals, .)[1]]
           order by $fst 
             return
              <author-group>
                  {$entries[$fst eq lower-case(substring(author,1,1))]}
              </author-group>
   }
 </groups>

应用于提供的XML文档

<feed>
  <entry>
    <author>a</author>
    <title>Title a</title>
  </entry>
  <entry>
    <author>b</author>
    <title>Title ba</title>
  </entry>
  <entry>
    <author>ab</author>
    <title>Title ab</title>
  </entry>
  <entry>
    <author>bb</author>
    <title>Title bb</title>
  </entry>
</feed>

生成想要的正确结果

<groups>
   <author-group>
      <entry>
         <author>a</author>
         <title>Title a</title>
      </entry>
      <entry>
         <author>ab</author>
         <title>Title ab</title>
      </entry>
   </author-group>
   <author-group>
      <entry>
         <author>b</author>
         <title>Title ba</title>
      </entry>
      <entry>
         <author>bb</author>
         <title>Title bb</title>
      </entry>
   </author-group>
</groups>