在Xquery中是否有SELECT WHERE ... IN等效?

时间:2014-11-29 06:33:51

标签: xml xpath xquery

我是Xquery的新手并且很难处理这个问题。 基本上,我目前的XML文件结构是这样的:

<root>
   <a>
      <aid>XX</aid>
      ...
   </a>
   <a>
      <aid>xx</aid>
      ...
   </a>
   <b>
      <bid>xx</bid>
      ...
   </b>
   <b>
      <bid>xx</bid>
      ...
   </b>
...
</root>

我想要获得的是b元素的信息,其中&#34; bid&#34; 不等于任何&#34;援助&#34;来自一个元素。 我试着这样做。首先,我让一个变量来持有援助:

let $aid := (xpath to the aid elements)

然后我尝试做了类似&#34; SELECT WHERE IN&#34;来自传统的sql。即:

for $b in (xpath to b elements)

where $b/bid != $aid(我试图实现NOT IN效果)

return $b/(infomation)

但问题是我找不到合适的方法来做到这一点。我也试过

where $e/bid != $aid[*]

,它也没有用。我在错误的轨道上吗?无论如何在Xquery(1.0)中实现这一点?或者是否有其他方法可以获得所需的信息?

3 个答案:

答案 0 :(得分:2)

  

b元素,其“出价”不等于来自元素的任何“援助”。

最直接的方法是

for $b in //b
where not(exists(//a[aid = $b/bid]))
return $b

答案 1 :(得分:0)

我不确定在您的设置中是否可以使用XPath方法。遵循XPath

//b/bid[not(./text() = //a/aid/text())]/text()

应用于示例XML

<root>
  <a>
    <aid>XX</aid>
  </a>
  <a>
    <aid>YY</aid>
  </a>
  <b>
    <bid>XX</bid>
  </b>
  <b>
    <bid>YY</bid>
  </b>
  <b>
    <bid>ZZ</bid> 
  </b>
</root>

返回ZZ 正如您所提到的,您希望从b节点获取bid值不等于任何aid值的所有信息,我假设您有{{1}的更多子节点}和a个节点。要使匹配的b节点与XPath之后的所有子节点一起

b

应用于扩展示例XML

//b[bid[not(./text() = //a/aid/text())]]

返回

<root>
  <a>
    <aid>XX</aid>
    <more>more a XX</more>
  </a>
  <a>
    <aid>YY</aid>
    <more>more a YY</more>
  </a>
  <b>
    <bid>XX</bid>
    <more>more b XX</more>
  </b>
  <b>
    <bid>YY</bid>
    <more>more b YY</more> 
  </b>
  <b>
    <bid>ZZ</bid>
    <more>more b ZZ</more>
  </b>
</root>

答案 2 :(得分:0)

=运算符实际上在XQuery中进行了成员资格测试。

因此,

a = ('foo', 'bar', 'baz', 'qux')

实际测试a是否 foobarbazqux

所以 - 它只是标准的相等运算符,用作WHERE IN的等价运算符,一边给它一个序列。