XQuery - 使用 eXist-db 删除空节点

XQuery - Remove empty nodes using eXist-db

我正在尝试删除 XML 中的所有空 <paragraph> 节点。这是我拥有的:

<root>
    <text>
        <paragraph>This is some text</paragraph>
        <paragraph></paragraph>
        <paragraph>More text</paragraph>
    </text>
    <text>
        <paragraph>Another paragraph</paragraph>
        <paragraph></paragraph>
    </text>
</root>

这是我的 XQuery:

let $root-ele as element() := doc("text.xml")/*
return 
    update delete $root-ele/text[paragraph = '']

它似乎没有更新文件,但我不确定为什么?

您编写的代码应该删除两个 <text> 元素 - 而不是空的 <paragraph> 元素。让我们暂时搁置这个问题,弄清楚为什么您的代码对源文件没有 any 影响。

首先,你确定它没有任何效果吗?根据您的编辑环境,您可能需要关闭并重新打开 text.xml 文档才能看到更改。

一旦您确定文档确实没有被修改,我猜想您的 doc() 函数没有正确 select 正确地编辑文档。要排除故障,请尝试提供文档的完整绝对路径,例如 doc('/db/text.xml')doc('/db/apps/my-app/text.xml').

一旦确认您正在正确寻址文件,使用 XPath 确认您正在 selecting 所需的节点,例如,doc('/db/test.xml')/root/text/paragraph[. = ''] 到 select 空段落.

一旦您能够看到所需的节点,我建议您使用 FLWOR 删除每个有问题的实例:

for $p in doc('/db/test.xml')/root/text/paragraph[. = '']
return
    update delete $p

正如有关 eXist 的 XQuery 更新语法的文档所阐明的那样 - 请参阅 http://exist-db.org/exist/apps/doc/update_ext.xml#syntax 的第 3 段 - 您应该始终尝试使您的更新尽可能接近更新的目标节点。

... be cautious when deleting or replacing nodes that are still being used by enclosing code. This is because a delete or replace will be processed immediately, and the deleted or replaced node will no longer be available to the query... However, an expression like the following [see sample code in link] is safe as it only modifies the current iteration variable...