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 为真,因此如果 $x
是 1
,这仍然是 returns true
因为 $x
不等于 2
或 3
.
问题是当您认为通过将 !=
更改为 =
来颠倒逻辑时。但两者并不是彼此的对立面。
=
当左侧序列中的任何项目等于右侧序列中的任何项目时为真。 !=
当左侧序列中的任何项目与右侧序列中的任何项目不同时为真。
( 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
。
我 运行 遇到以下问题,在语法方面我不确定为什么会得到我得到的结果。
我有以下 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 为真,因此如果 $x
是 1
,这仍然是 returns true
因为 $x
不等于 2
或 3
.
问题是当您认为通过将 !=
更改为 =
来颠倒逻辑时。但两者并不是彼此的对立面。
=
当左侧序列中的任何项目等于右侧序列中的任何项目时为真。 !=
当左侧序列中的任何项目与右侧序列中的任何项目不同时为真。
( 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
。