【问题标题】:How to check whether node $N is present in the sequence-of-nodes $S in XQuery?如何检查节点 $N 是否存在于 XQuery 中的节点序列 $S 中?
【发布时间】:2015-06-15 21:20:12
【问题描述】:

我知道 XQuery 中采用 XPath 表达式的每个变量都可以由一组节点组成

let $x := //cities[@population > '50000']//*

或者

let $y := //something/following::*

我想知道是否有一个布尔函数来检查$z 是否属于这些节点集,例如$x$y

如果不是,那么如果第一个变量(节点序列)包括第二个变量(一个节点或节点序列),我如何声明这样的函数以获取两个变量并返回 true

出于特定目的,我做了以下测试:

declare function local:inside($y,$x) as xs:boolean
{
  let $r :=  ? (: want to know if $y include $x or not :)
  return $r
};
let $db := doc('products.xq')
let $items := $db/item//*
let $pricesInItems := $db//price[$items//.]   (: $db//price[local:inside($items, .)] :)
                    (: ^ it doesn't work, by the way :)
return $pricesInItems 

对于这个数据库:

<page>
  <products> 
      <item foo="f1"> 
          <price>100 </price> 
      </item>  
        <item foo="f2"> 
          <price>200 </price> 
      </item>  
  </products>
  <price>300 </price>
</page>

一个谓词表达式或一个函数,它选择$db/item//* 内的所有价格。请注意,这只是一个示例,我想要一个适用于任何两个变量的通用隶属函数或谓词表达式。

【问题讨论】:

    标签: xml function xpath xquery


    【解决方案1】:

    如果您使用= 运算符,它将使用基于集合的逻辑。例如:

    let $set := (2, 4, 6, 8, 10)
    return ((6 = $set), (7 = $set))
    
    => (true(), false())
    

    这同样适用于两组之间的比较:

    (1, 2, 3, 4) = (4, 5, 6)
    => true()
    

    【讨论】:

    • 如果集合是由 XPath 表达式选择的节点的集合怎么办?请重新考虑我修改后的问题
    • 错误答案,@Ahmad 对测试一组节点的成员资格感兴趣,而不是原子值。
    【解决方案2】:

    两种方法来测试节点 $N 是否存在于节点序列 $S 中:

    (a)exists($S intersect $N)

    exists() 如果在布尔上下文中使用是多余的,例如你可以写if($S intersect $N)

    (b)exists($S[. is $N])

    (同样,在布尔上下文中,您可以写成if($S[. is $N])

    【讨论】:

    • 请问为什么这段代码不起作用? let $y := $db//item//* let $z := $db//price[exists($y intersect .)] 根据有问题的数据库 $z 应该返回项目节点内的两个价格节点,但它什么也不返回
    • 谢谢,真奇怪!我认为它现在有效。也许我之前做错了
    猜你喜欢
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多