在xml中找到每个元素的最大属性?

时间:2015-04-01 04:21:41

标签: xml database xquery

我一直在寻找过去一小时如何找到按元素分组的最大值,但没有成功。

我试图用最高的玩家数量PER用户报告pid和uid以及播放列表的播放次数

这是我的xml文件:

<!DOCTYPE users SYSTEM "users.dtd">
<users>
 <user uid = "u1" dob = "06/03/94" email = "tom@hotmail.com">
    <surname> Doe</surname>
    <givennames> Jon </givennames>
    <follows who = "u1 u2"/>
    <playlists>
      <playlist pid = "p1" created ="12/03/11" playcount = "5" /> 
    </playlists>
   </user>

  <user uid = "u2" dob = "06/03/95" email = "jane@hotmail.com">
    <surname> Dod</surname>
    <givennames> Jane </givennames>
    <follows who = "u1 u3"/>
   </user>

   <user uid = "u3" dob = "06/04/95" email = "dave@hotmail.com">
    <surname> ron</surname>
    <givennames> dave </givennames>
    <follows who = "u1 u2"/>
    <playlists>
      <playlist pid = "p3" created ="12/02/09" playcount = "9"/> 
      <playlist pid = "p9" created = "11/11/11" playcount = "11"/>
     </playlists>
   </user>

   <user uid = "u4" dob = "06/04/99" email = "jeff@hotmail.com">
    <surname> dun</surname>
    <givennames> jeff</givennames>
     <follows who = "u1 u2 u3"/>
    <playlists>
      <playlist pid = "p4" created ="12/02/09" playcount = "3"/> 
      <playlist pid = "p6" created ="12/02/09" playcount = "55"/>
    </playlists>
   </user>

</users>

我已经尝试过了

for $user in doc("users.xml")/users/user
 where $users/playlists/playlist/@playcount = max($users/playlists/playlist/@playcount)
   return $user

但它没有工作......我尝试过的任何工作都没有...它要么返回每个用户的最大游戏次数(这是我自那以后得到的最好的&#39;有点想从我的查询得到的东西)或者我得到每个播放列表

我需要一个输出的查询:

<favorites>
   <user uid = "u1" pid = "p1" playcount = "5"/>
   <user uid = "u2" />
   <user uid = "u3" pid = "p9" playcount = "11"/>
   <user uid = "u4" pid = "p6" playcount = "55"/>
</favorites>

播放列表是一个可选元素,因此如果用户没有播放列表,那么只需报告uid ..

任何帮助?真的在我的智慧结束这里因为看起来很难找到一个查找使用由元素分组的max函数的查询的例子。

1 个答案:

答案 0 :(得分:2)

我猜你需要分支案例,还要自定义输出格式。这是我的xquery:

let $users := doc("users.xml")/users/user
for $user in $users
let $maxCount := max($user/playlists/playlist/@playcount)
let $maxPlaylist := $user/playlists/playlist[@playcount = $maxCount]
return if (count($maxPlaylist) > 0)
then <user uid="{$user/@uid}" pid = "{$maxPlaylist/@pid}" playcount = "{$maxPlaylist/@playcount}"/>
else <user uid="{$user/@uid}"/>