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被视为相同。

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

谢谢,索尼

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

这里有一个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

最新更新