2012-02-23 90 views
2

我有一个带入口元素的xml。每个条目都有一个作者。我试图以这样的方式对条目进行分组,使得每个组由条目的作者名称以唯一字母字符开始。所有参赛作品,其作者名称开头字母“A”应该在一组,所有参赛作品,其作者姓名开始字母“b”应在另一组,等等..xquery组名按字母顺序创建联系人列表

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> 

在我的例子中,两个作者群预计 - 第一作者格罗包含所有作者的名字以第二作者群组成,其作者姓名以b开头

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

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

谢谢, 索尼

回答

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