"NOT IN" 子句的 Xquery 版本未按预期工作

Xquery version of "NOT IN" clause not working as expected

我有一个xml文件可以在下面link下载: http://expirebox.com/download/483d465091802df68da10feddc1ec98c.html

我正在尝试 select 我的 movies.xml 中所有那些没有 "live action" 和 "camp" 风格的电影。为此,我使用以下查询

for $movie in db:open("movies","movies.xml")/movies/movie
where $movie/styles/style!=("noir","anthology")
return $movie

但是,电影中的所有节点都得到 selected。我的查询出了什么问题?

一些专家指出,由于涉及 XQuery 的语义,标准不等于运算符无法在这种情况下工作。但是,我的目的是找到一个 SQL 特征的相应查询,而不仅仅是理解语义。

!= 使用集合比较逻辑。

对于不在该序列中的值,例如 "foo",表达式 "foo" != ("noir", "anthology") returns true 然而,表达式 "noir" != ("noir", "anthology") 将还有 return true。这是因为 "noir" 不等于序列中的一项,"anthology",即使它也等于序列中的一项。表达式 "noir" = ("noir", "anthology") returns true 因为 "noir" 等于序列中的一项,"noir".

参考规范: https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans

NOTE: If $x is bound to a node-set, then $x="foo" does not mean the same as not($x!="foo"): the former is true if and only if some node in $x has the string-value foo; the latter is true if and only if all nodes in $x have the string-value foo.

使用:

where not($movie/styles/style=("noir","anthology"))

或:

where $movie/styles/style[not(.=("noir","anthology"))]