XQuery != 带有序列的运算符

XQuery != operator with a sequence

我 运行 遇到以下问题,在语法方面我不确定为什么会得到我得到的结果。

我有以下 FLOWR 表达式:

(: example 1 :)
for $attr in $node/@*
where $attr/fn:local-name != ("src", "type", "id")
return $attr

我心目中的英文版是:Get me all the attributes that are not src, type, or id.

但是,当我 运行 这样做时,每个属性都会返回,包括 src, type, and 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", and "id",没有别的。

所以,回到我原来的情况,为了让它按照我期望的方式工作,我必须使用以下语句:

(: example 3 :)
for $attr in $node/@*
where fn:not($attr/fn:local-name = ("src", "type", "id"))
return $attr

而这个returns除src, type, and id以外的所有属性。

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

我的问题的 xPath 等效项类似于:

$node/@*[fn:not(./fn:local-name(.) = ("src", "type", "id"))]

谁能解释一下我的想法哪里有问题?

我正在使用 xquery version "1.0-ml"

当您说 $x != (1, 2, 3) 时,翻译成 $x does not equal 1, 2, and 3。如果左侧和右侧的任何值不相等,!= 运算符将 return 为真,因此如果 $x1,这仍然是 returns true 因为 $x 不等于 23.

问题是当您认为通过将 != 更改为 = 来颠倒逻辑时。但两者并不是彼此的对立面。

= 当左侧序列中的任何项目等于右侧序列中的任何项目时为真。 != 当左侧序列中的任何项目与右侧序列中的任何项目不同时为真。

( 1, 2, 3 ) = ( 1, 5 )  (: true :)
( 1, 2, 3 ) = ( )       (: false :)
( 1, 2, 3 ) != ( 1, 5 ) (: true :)

如您所见,x=y 的反义词是 not(x=y)

当左侧序列或右侧序列是单例时,根据定义not(x=y)等于x!=y