我有一个xml文件,可以在以下链接中下载: http://expirebox.com/download/483d465091802df68da10feddc1ec98c.html
我试图在我的movies.xml中选择所有没有“真人”和“阵营”风格的电影。为实现这一点,我使用以下查询
for $movie in db:open("movies","movies.xml")/movies/movie
where $movie/styles/style!=("noir","anthology")
return $movie
但是,电影中的所有节点都会被选中。我的查询出了什么问题?
一些专家指出,由于涉及XQuery的语义,标准不能在这种情况下不兼容运算符。但是,我的目的是找到一个SQL功能的相应查询,而不仅仅是理解语义。
答案 0 :(得分:2)
!=
使用set比较逻辑。
对于不在该序列中的值,例如" foo",表达式"foo" != ("noir", "anthology")
返回true
但是,表达式"noir" != ("noir", "anthology")
也将返回{{ 1}}。这是因为" noir"不等于序列中的一个项目"选集",即使它也等于序列中的一个项目。表达式true
返回"noir" = ("noir", "anthology")
因为" noir"等于序列中的一个项目," noir"。
参考规格: https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans
注意:如果
true
绑定到节点集,则$x
与$x="foo"
的含义不同:当且仅当not($x!="foo")
中的某个节点时,前者为真1}}具有字符串值$x
;当且仅当foo
中的所有节点都具有字符串值$x
时,后者才为真。
使用:
foo
或:
where not($movie/styles/style=("noir","anthology"))