2016-06-10 53 views
1

我的XPath表達式中的錯誤在哪裏?我需要檢索所有上傳的視頻的平均等級大於或等於3的所有用戶的配置文件帶有謂詞和條件的XPath表達式

<?xml version="1.0" encoding="UTF-8"?> 
<smileyvideo> 
    <video id="8628149"> 
     <uploader>[email protected]</uploader> 
     <title>Bad Apple</title> 
     <ratings> 
     <rating user="[email protected]" value="1" /> 
     <rating user="[email protected]" value="2" /> 
     </ratings> 
    </video> 
    <video id="123456"> 
     <uploader>[email protected]</uploader> 
     <title>Musician Cat</title> 
     <ratings> 
     <rating user="[email protected]" value="3" /> 
     <rating user="[email protected]" value="3" /> 
     <rating user="[email protected]" value="4" /> 
     </ratings> 
    </video> 
    <video id="474920"> 
     <uploader>[email protected]</uploader> 
     <title>Shrek</title> 
     <ratings> 
     <rating user="[email protected]" value="1" /> 
     <rating user="[email protected]" value="1" /> 
     </ratings> 
    </video> 
    <!-- Users List --> 
    <user> 
     <name>Emil P. Wager</name> 
     <email>[email protected]</email> 
    </user> 
    <user> 
     <name>Satsuya Oda</name> 
     <email>[email protected]</email> 
    </user> 
    <user> 
     <name>Anthony J. Jenkins</name> 
     <email>[email protected]</email> 
     <bio>I am a food scientist, currently working in iceland. Make sure to 
check out my blog!</bio> 
    </user> 
</smileyvideo> 

我的XPath表達式是

//user[preceding-sibling::video/uploader[avg((following-sibling::ratings/rating/@value))>=3]/text()=//user/email/text()] 
+0

是什麼版本?我懷疑這可以使用XPath 1.0 .. – har07

+0

是的,XPath 1.0不支持甚至函數,我認爲,我使用XPath 2.0 – JeyKo

回答

2

有XPath中沒有avg()功能1.0(我懷疑你在這裏使用)。

試試這個:

//video[sum(ratings/rating/@value) div count(ratings/rating) >= 3]/uploader 

或者略短的變體:

//video[ratings[sum(rating/@value) div count(rating) >= 3]]/uploader 

從那裏往<user>對象的列表很簡單:

//user[email = //video[ratings[sum(rating/@value) div count(rating) >= 3]]/uploader] 

或者,當avg()可作爲一個功能,因爲你使用XPath 2.0及以上版本中,甚至更短:的XPath

//user[email = //video[avg(ratings/rating/@value) >= 3]/uploader] 
+0

謝謝你的答案@Tomalak!但是我使用XPath 2.0,我必須使用avg,這是我們在講座中學習的。我嘗試了表達式 // video [uploader [avg((follow-sibling :: ratings/rating/@ value))> = 3]/text()= // user/email/text()] and它工作正確 – JeyKo

+0

使用什麼工程。如果'avg()'可用,請使用它。這並不會改變我的答案(除了表達式會變得*甚至更短)。你的文章沒有包括你使用的XPath版本,而且我也不是一個透視。下次請包括您正在使用的軟件版本。作爲一般性的提示,我會勸阻使用這些任務的軸(「兄弟姐妹」等)。 – Tomalak

+0

謝謝,這是有效的。我發現我的表情無法正常工作,因爲/ /電子郵件前的用戶/文本() 你能解釋一下,如果它不是困難的,爲什麼?我很困惑,因爲我在前面的評論中寫道,在視頻檢索表達中,相同的條件正常工作... – JeyKo