2015-03-31 167 views
0

鑑於以下xml文件,我需要報告具有少於4個關注者的用戶的uid和關注者的uid。如何計算xml文件中某個特定屬性的出現次數?

<!DOCTYPE users SYSTEM "users.dtd"> 
<users> 
<user uid = "u1" dob = "06/03/94" email = "[email protected]"> 
    <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 = "[email protected]"> 
    <surname> Dod</surname> 
    <givennames> Jane </givennames> 
    <follows who = "u1 u3"/> 
    <playlists> 
     <playlist pid = "p2" created ="12/02/10" playcount = "2"/> 
    </playlists> 
    </user> 

    <user uid = "u3" dob = "06/04/95" email = "[email protected]"> 
    <surname> ron</surname> 
    <givennames> dave </givennames> 
    <follows who = "u1 u2"/> 
    <playlists> 
     <playlist pid = "p3" created ="12/02/09" playcount = "9"/> 
    </playlists> 
    </user> 

    <user uid = "u4" dob = "06/04/99" email = "[email protected]"> 
    <surname> dun</surname> 
    <givennames> jeff</givennames> 
    <follows who = "u1 u2 u3"/> 
    <playlists> 
     <playlist pid = "p4" created ="12/02/09" playcount = "3"/> 
    </playlists> 
    </user> 

</users> 

我需要一個查詢這給輸出:

<fewfollowers> 
    <who uid = "u2"> 
      <follower uid = "u1"/> 
      <follower uid = "u3"/> 
      <follower uid = "u4"/> 
    </who> 
    <who uid = "u3"> 
      <follower uid = "u2"/> 
      <follower uid = "u4"/> 
    </who> 
    <who uid = "u4"> 
    </who> 
</fewfollowers> 

ATTLIST如下誰IDREFS #IMPLIED

如果報告的用戶不具有任何的追隨者,只是彙報自己的uid

我試過使用count()函數,但我沒有得到任何有用的東西。我嘗試:

for $user in doc("users.xml")/users/user 
    return count($user/follows/@who = $user") 

但這似乎只返回@who的計數爲每個用戶$,而不是特定的元素。此外,我將如何遍歷IDREFS屬性?他們應該由空白區分,但我的計數函數似乎只註冊爲1屬性而不是多個。我曾預計我的函數返回ATLEAST:

1, 2, 2, 3 

但它返回:

1,1,1,1 
+0

將多個ID填充到屬性中只是一個糟糕的設計。你能改變它嗎? – OldProgrammer 2015-03-31 23:27:43

+0

你在說什麼!ATTLIST跟隨誰IDREFS #implied?如果是這樣,我不能改變這一點。 – user125535 2015-03-31 23:30:32

回答

0

我同意@oldProgrammer。你不應該把ID放在一個屬性中,但可能你不能控制它。如果你只是把它們放入元素中,這樣你就不必標記它們。

你得到1,1,1,1的原因是因爲你的count函數正在做比較,它可能是真或假。這將永遠是1.所以我認爲你的意思是要在$user這個$user/follows/@who[. $user]之間加上一個謂詞。雖然這不會或者因爲$user是用戶元素。

我認爲你正在尋找的是這行代碼

fn:count($user/follows/fn:tokenize(@who, ' ')) 

根據你給了我們它會返回這個XML。

2 
2 
2 
3 

您需要來標記誰在白色空間屬性來獲得追隨者

0

假設你的DTD @who定義爲類型IDREFS的計數,並@uid類型ID,你應該能夠做類似

let $followers := idref($user/follows/@who) 
return (count($followers) || string-join($followers/email, "; ") 
相關問題