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

时间:2016-02-19 17:29:39

标签: xquery crud 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 = '']

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

1 个答案:

答案 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段 - 您应该始终尝试使更新尽可能接近更新的目标节点。

  

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