在以下XML中(使用Xquery):
let $xml :=
(<list xml:id="first">
<item corresp="a"/>
</list>,
<list xml:id="second">
<item corresp="a"/>
<item corresp="b"/>
</list>,
<list xml:id="third">
<item corresp="b"/>
</list>,
<list xml:id="third">
<item corresp="c"/>
</list>,
<list xml:id="forth">
<item corresp="b"/>
<item corresp="c"/>
</list>)
我试图返回<list>
,其中@corresp
有a
和b
(这是一个由1-15项动态构造的系列)。然而,这一点:
return $xml[./item[@corresp=("a","b")]]
返回
<list xml:id="first">
<item corresp="a"/>
</list>
<list xml:id="second">
<item corresp="a"/>
<item corresp="b"/>
</list>
<list xml:id="third">
<item corresp="b"/>
</list>
<list xml:id="forth">
<item corresp="b"/>
<item corresp="c"/>
</list>
当我在寻找这个结果时
<list xml:id="second">
<item corresp="a"/>
<item corresp="b"/>
</list>
此外,还动态地构造了("a","b")
中包含的参数。因此,我试图找出一个解决方案,它可以在一个系列中接受任意数量/组合的参数,在1到15之间。
我不知道如何构建谓词以返回预期的结果。
提前谢谢。
发布于 2019-11-24 09:59:34
您可以在谓词中使用every
,为候选list
元素指定序列中的每个键都必须满足corresp
属性的值。
表达式类似于:every $v in $seq satisfies $v
,如果satisfies
右侧的表达式对$seq
中的每个值返回true,则返回true。否则它会返回false。
所以在你的例子中:
<lists>
<list xml:id="first">
<item corresp="a"/>
</list>
<list xml:id="second">
<item corresp="a"/>
<item corresp="b"/>
</list>
<list xml:id="third">
<item corresp="b"/>
</list>
<list xml:id="third">
<item corresp="c"/>
</list>
<list xml:id="forth">
<item corresp="b"/>
<item corresp="c"/>
</list>
</lists>
/list[every $k in $keys satisfies item/@corresp = $k]
FYI,您还有any
,您使用与every
相同的方式,但是它返回true如果,得到它,表达式返回序列中任何项的true。
发布于 2019-11-23 16:15:06
只需将请求更改为
return $xml[item[@corresp="a"] and item[@corresp="b"]]
它将返回所需的输出。
<list xml:id="second">
<item corresp="a"/>
<item corresp="b"/>
</list>
您必须为每个<item>
匹配创建单独的谓词。
我猜您试图简化太多事情,因为您选择的是OR
而不是AND
,因为您的谓词正在检查item[@corresp...]
是否包含在集合("a","b")
中。
https://stackoverflow.com/questions/59009194
复制相似问题