xquery имена групп по алфавиту для создания списка контактов - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть XML с элементами ввода.У каждой записи есть автор.Я пытаюсь сгруппировать записи таким образом, чтобы каждая группа состояла из записей, имя автора которых начинается с уникального буквенного символа.Все записи, имена авторов которых начинаются с буквы «а», должны входить в одну группу, все записи, авторы которых имена начинаются с буквы «б», должны входить в другую группу и т. Д.

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

Я хотел бы игнорировать случаи в именах авторов, т.е.

Я бы тогда взял каждую группу авторов и создал список контактов.

Спасибо, Sony

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Это преобразование 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>
1 голос
/ 24 февраля 2012

Здесь решение 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

...