示例我有像这样的xml数据
<a>
<book id="bk1">
<test>Yeah</test>
</book>
<book id="bk2">
<test>Hellow</test>
</book>
<book id="bk3">
<test>yaya</test>
<test>love</test>
<test>hello</test>
</book>
</a>
我的问题是使用xquery选择book id,其中test元素不包含任何值=&#34; love&#34;
预期产出:
<book id="bk1"/>
<book id="bk2"/>
但我的输出如下:
<book id="bk1"/>
<book id="bk2"/>
<book id="bk3"/>
以下代码:
for $b in /a
let $i := $b/book/test
let $id := $b/book/@id
where $i != "love"
return <book id="@id"/>
我怀疑它会循环播放bk3并找到另一个不爱的测试值并返回它。怎么解决?
答案 0 :(得分:1)
你的代码为我返回一个空的元素。而不是循环遍历“容器”<a/>
节点,循环遍历书籍并根据需要进行过滤。
for $book in /a/book
where not($book/test = "love")
return <book>{ $book/@id }</book>
第二个问题是@id
属性:要在cunstruction期间访问变量,您必须在其周围放置大括号并访问变量,而不是在不给出上下文的情况下访问某些属性:<book id="{ $id }"/>
。我通过包含原始元素的属性而不是重构它来使用稍微不同的构造元素的方法。
编辑:为支持XQuery 3.0的系统增加一个内容:
/a/book[not($book/test = "love")]/element book { ./@id }