如何检查节点$ N是否存在于XQuery中的节点序列$ S中?

时间:2015-06-15 21:20:13

标签: xml function xpath xquery

我知道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//*内的所有价格。请注意这只是一个例子,我希望有一个通用的成员函数或谓词表达式,适用于任何两个变量。

2 个答案:

答案 0 :(得分:1)

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

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

=> (true(), false())

同样适用于两组比较:

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

答案 1 :(得分:1)

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

(a)exists($S intersect $N)

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

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

(类似地,在布尔上下文中,您可以编写if($S[. is $N])