2016-06-10 104 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