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

Sto*_*age 0 xquery crud exist-db

我试图删除<paragraph>我的XML 中的所有空节点.这就是我所拥有的:

<root>
    <text>
        <paragraph>This is some text</paragraph>
        <paragraph></paragraph>
        <paragraph>More text</paragraph>
    </text>
    <text>
        <paragraph>Another paragraph</paragraph>
        <paragraph></paragraph>
    </text>
</root>
Run Code Online (Sandbox Code Playgroud)

这是我的XQuery:

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

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

joe*_*wiz 5

您编写的代码应删除这两个<text>元素 - 而不是空<paragraph>元素.我们暂时将这个问题放在一边,弄清楚为什么你的代码对源文件没有任何影响.

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

一旦你确定文档真的没有被修改,我猜你的doc()功能没有正确选择文档.要进行故障排除,请尝试提供文档的完整绝对路径,例如,doc('/db/text.xml')doc('/db/apps/my-app/text.xml').

确认正确处理文件后,使用XPath确认您正在选择所需的节点,例如,doc('/db/test.xml')/root/text/paragraph[. = '']选择空段落.

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

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

由于有关eXist的XQuery Update语法的文档清楚 - 请参阅http://exist-db.org/exist/apps/doc/update_ext.xml#syntax的第3段- 您应该始终尝试使更新尽可能接近目标更新的节点尽可能.

...删除或替换仍被封闭代码使用的节点时要小心.这是因为删除或替换将立即处理,删除或替换的节点将不再可用于查询...但是,如下表达式[请参阅链接中的示例代码]是安全的,因为它只修改了当前迭代变量......