首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择一个系列中所有(动态创建)项匹配属性的节点

选择一个系列中所有(动态创建)项匹配属性的节点
EN

Stack Overflow用户
提问于 2019-11-23 15:30:38
回答 2查看 36关注 0票数 0

在以下XML中(使用Xquery):

代码语言:javascript
运行
复制
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>,其中@correspab (这是一个由1-15项动态构造的系列)。然而,这一点:

代码语言:javascript
运行
复制
return $xml[./item[@corresp=("a","b")]]

返回

代码语言:javascript
运行
复制
<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>

当我在寻找这个结果时

代码语言:javascript
运行
复制
<list xml:id="second">
  <item corresp="a"/>
  <item corresp="b"/>
</list>

此外,还动态地构造了("a","b")中包含的参数。因此,我试图找出一个解决方案,它可以在一个系列中接受任意数量/组合的参数,在1到15之间。

我不知道如何构建谓词以返回预期的结果。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-24 09:59:34

您可以在谓词中使用every,为候选list元素指定序列中的每个键都必须满足corresp属性的值。

表达式类似于:every $v in $seq satisfies $v,如果satisfies右侧的表达式对$seq中的每个值返回true,则返回true。否则它会返回false。

所以在你的例子中:

代码语言:javascript
运行
复制
<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。

票数 2
EN

Stack Overflow用户

发布于 2019-11-23 16:15:06

只需将请求更改为

代码语言:javascript
运行
复制
return $xml[item[@corresp="a"] and item[@corresp="b"]]

它将返回所需的输出。

代码语言:javascript
运行
复制
<list xml:id="second">
    <item corresp="a"/>
    <item corresp="b"/>
</list>

您必须为每个<item>匹配创建单独的谓词。

我猜您试图简化太多事情,因为您选择的是OR而不是AND,因为您的谓词正在检查item[@corresp...]是否包含在集合("a","b")中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59009194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档