2010-11-25 46 views
0

J'utilise eXist Xquery. Je suis coincé avec ce problème.Xquery regroupant des éléments où des éléments les uns par rapport aux autres

J'ai une collection de 20 xml avec le contenu selon comme ci-dessous:

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> 

et etc ...

Un utilisateur peut avoir plusieurs dossiers, et un dossier peut avoir plusieurs images. 1 xml est égal à 1 données d'image.

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> 

Sortie:

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

Merci vous.

Répondre

3
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> 
+0

Bonne réponse, +1. –