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)
它似乎没有更新文件,但我不确定为什么?
您编写的代码应删除这两个<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段- 您应该始终尝试使更新尽可能接近目标更新的节点尽可能.
...删除或替换仍被封闭代码使用的节点时要小心.这是因为删除或替换将立即处理,删除或替换的节点将不再可用于查询...但是,如下表达式[请参阅链接中的示例代码]是安全的,因为它只修改了当前迭代变量......