我是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)中实现这一点?或者是否有其他方法可以获得所需的信息?
答案 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
是否 foo
,bar
,baz
或qux
。
所以 - 它只是标准的相等运算符,用作WHERE IN
的等价运算符,一边给它一个序列。