Xquery группировка предметов, где предметы относятся друг к другу - PullRequest
0 голосов
/ 25 ноября 2010

Я использую eXist Xquery. Я застрял с этой проблемой.

У меня есть коллекция из 20 xml с содержанием, как показано ниже:

1.123.15.200.xml
<element name="userID">P111</element>
<element name="folderUID">A1</element>
<element name="imageUID">IMG15234</element>

1.123.15.205.xml
<element name="userID">P115</element>
<element name="folderUID">A34</element>
<element name="imageUID">IMG15238</element>

и т. Д. *

У пользователя может быть несколько папок, а в папке может быть несколько изображений. 1 xml равен 1 данным изображения.

for $x in distinct-values(collection('db/mapdb')//element[@name="userID"])
return
<group>
{
    // This part is where I have issue, i have no idea what to write in within this portion?
}
</group>

Выход:

<group>
<user>P111</user>
<folder id="A1">
<image>IMG15238</image>
<image>IMG16234</image>
<image>IMG23523</image>
</folder>
<folder id="A82">
<image>IMG132238</image>
<image>IMG42344</image>
<image>IMG242523</image>
</folder>
</group> 

Спасибо.

1 Ответ

3 голосов
/ 25 ноября 2010
let $col := collection('db/mapdb')//*[element]
for $user in distinct-values($col/element[@name eq 'userID']),
return 
<group>
   <user>{$user}</user> 
{ 
   for $fold in distinct-values($col[element[@name eq 'userID'] eq $user]
                                 /element[@name eq 'folderUID'])
   return
   <folder id="{$fold}"> 
{
      for $img in $col[element[@name eq 'userID'] eq $user]
                      [element[@name eq 'folderUID'] eq $fold]
                      /element[@name eq 'imageUID']
      return
      <image>{string($img)}</image> 
}
   </folder> 
} 
</group> 
...