2012-02-23 91 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