2016-02-19 88 views
0

我想删除我的XML所有空<paragraph>节点的空节点。下面是我有:的XQuery - 删除使用存在,但DB

<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 = ''] 

它似乎并没有被更新文件,但我不知道为什么?

回答

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更新语法文件明确 - 见http://exist-db.org/exist/apps/doc/update_ext.xml#syntax第3款 - 您应该尽可能使更新尽可能靠近更新的目标节点。

...在删除或替换封闭代码仍在使用的节点时要小心谨慎。这是因为删除或替换,将会立即处理,并删除或替换节点将不再提供给查询......然而,就像一个表达式如下[见链接样例代码]是安全的,因为它只修改当前迭代变量...

+0

感谢您的帮助,结果证明文件路径很好,但大部分问题是我使用eXide,而且我的浏览器正在缓存响应...而另一个问题在于我按照您的建议选择了错误的节点进行删除。谢谢你的帮助! – Stormdamage

+0

很高兴听到您标识了关键阻止程序 - 浏览器缓存。我从来没有使用过eXide,所以如果你能够重现导致eXide响应被缓存的条件,请将它们与现有的开放邮件列表共享:https://lists.sourceforge.net/lists/列表信息/存在开放。无论如何,如果你还没有订阅,我欢迎你订阅。这是一个提问和查看其他人使用eXist的好地方。 – joewiz