【发布时间】:2020-06-08 14:21:08
【问题描述】:
我有以下 xml:
<?xml version="1.0" encoding="UTF-8"?>
<publication>
<scientificPublication>
<id>2347823476</id>
<book>
<chapter>
<author>Tom</author>
<genre>Java</genre>
<genre>Webservice</genre>
</chapter>
</book>
<book>
<chapter>
<author>Mike</author>
<genre>C</genre>
<genre>Machine Learning</genre>
</chapter>
</book>
<book>
<chapter>
<author>William</author>
<genre>JavaScript</genre>
<genre>Frontend</genre>
</chapter>
</book>
</scientificPublication>
</publication>
我需要使用 XQuery 过滤 xml,所以最后我有以下结果:
<?xml version="1.0" encoding="UTF-8"?>
<publication>
<scientificPublication>
<id>2347823476</id>
<book>
<chapter>
<author>Tom</author>
<genre>Java</genre>
<genre>Webservice</genre>
</chapter>
</book>
</scientificPublication>
</publication>
所以基本上我的想法是从第一本书中找到所有兄弟节点,然后使用函数fn:remove((item,item,...),position) 删除它们。所以我找到了所有需要用下面的xpath移除的节点:
publication/*/book[not(./*[(genre='Java')and(genre='Webservice')])]
然后我尝试使用代码将它们从 xml 中删除:
declare function local:process-xml($element) {
let $orig := $element
let $toFilter := $element/*/book[not(./*[(genre='Java')and(genre='Webservice')])]
let $el := local:filter($orig, $toFilter)
return $el
};
declare function local:filter($elements, $toFilter) {
for $i in $toFilter
let $pos := position()
remove($lements, $pos)
return $elements
};
当我尝试执行此操作时,我收到一条错误消息,说他停止了,期待第二个函数“返回”。 有人知道我在这种情况下做错了什么吗?
【问题讨论】: