我有一个带有入口元素的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