我正在尝试删除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 = '']
它似乎没有更新文件,但我不确定为什么?
答案 0 :(得分: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
由于有关eXist的XQuery Update语法的文档清楚明了 - 请参阅http://exist-db.org/exist/apps/doc/update_ext.xml#syntax的第3段 - 您应该始终尝试使更新尽可能接近更新的目标节点。
...删除或替换仍被封闭代码使用的节点时要小心。这是因为删除或替换将立即处理,删除或替换的节点将不再可用于查询...但是,如下表达式[请参阅链接中的示例代码]是安全的,因为它只修改了当前迭代变量......