XQuery!=带序列的运算符

XQuery!=带序列的运算符,xquery,marklogic,Xquery,Marklogic,我遇到了以下问题,就语法而言,我不确定为什么会得到这样的结果 我有以下Flower表达式: (: example 1 :) for $attr in $node/@* where $attr/fn:local-name != ("src", "type", "id") return $attr 我心目中的英文版本是:获取所有非src、type或id的属性 但是,当我运行此命令时,会返回每个属性,包括src、type和id。当我将我的where语句更改为只有一个元素时,where$attr/fn

我遇到了以下问题,就语法而言,我不确定为什么会得到这样的结果

我有以下Flower表达式:

(: example 1 :)
for $attr in $node/@*
where $attr/fn:local-name != ("src", "type", "id")
return $attr
我心目中的英文版本是:
获取所有非src、type或id的属性

但是,当我运行此命令时,会返回每个属性,包括
src、type和id
。当我将我的
where
语句更改为只有一个元素时,
where$attr/fn:local name!=(“src”)
,则这将按预期工作-返回除
src
之外的所有属性。奇怪的是,它在与一个元素比较时有效,但与三个元素比较时无效

如果我颠倒我的逻辑,做出这样的陈述:

(: example 2 :)
for $attr in $node/@*
where $attr/fn:local-name = ("src", "type", "id")
return $attr
(: difference is = instead of != :)
然后,我还得到了我期望的结果,这只是3个属性,即src、type和id,而不是别的

因此,回到我的原始案例,为了让它以我期望的方式工作,我必须使用以下语句:

(: example 3 :)
for $attr in $node/@*
where fn:not($attr/fn:local-name = ("src", "type", "id"))
return $attr
这将返回除
src、type和id之外的所有属性

为什么会以这种方式发生?在我看来,例1和例3应该做同样的事情。但是,我无法让示例1按照我期望的方式工作

我的问题的xPath等价物类似于:

$node/@*[fn:not(./fn:local-name(.) = ("src", "type", "id"))]
有人能解释我的想法哪里有问题吗


我使用的是
xquery版本“1.0-ml”

当你说
$x!=(1,2,3)
转换为
$x的值不等于1,2和3
=运算符将返回true,因此如果
$x
1
,这仍然返回
true
,因为
$x
不等于
2
3
,问题在于您认为通过更改
来反转逻辑=进入
=
。但两者并非相反

当左侧序列中的任何项目等于右侧序列中的任何项目时,
=
为真<代码>=为真

( 1, 2, 3 ) = ( 1, 5 )  (: true :)
( 1, 2, 3 ) = ( )       (: false :)
( 1, 2, 3 ) != ( 1, 5 ) (: true :)
正如您所发现的,
x=y
的反面是
而不是(x=y)

当左侧序列或右侧序列为单态时,则根据定义
not(x=y)
等于
x=y