XQuery - 使用 eXist-db 删除空节点
XQuery - Remove empty nodes using 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 = '']
它似乎没有更新文件,但我不确定为什么?
您编写的代码应该删除两个 <text>
元素 - 而不是空的 <paragraph>
元素。让我们暂时搁置这个问题,弄清楚为什么您的代码对源文件没有 any 影响。
首先,你确定它没有任何效果吗?根据您的编辑环境,您可能需要关闭并重新打开 text.xml
文档才能看到更改。
一旦您确定文档确实没有被修改,我猜想您的 doc()
函数没有正确 select 正确地编辑文档。要排除故障,请尝试提供文档的完整绝对路径,例如 doc('/db/text.xml')
或 doc('/db/apps/my-app/text.xml')
.
一旦确认您正在正确寻址文件,使用 XPath 确认您正在 selecting 所需的节点,例如,doc('/db/test.xml')/root/text/paragraph[. = '']
到 select 空段落.
一旦您能够看到所需的节点,我建议您使用 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 段 - 您应该始终尝试使您的更新尽可能接近更新的目标节点。
... be cautious when deleting or replacing nodes that are still being used by enclosing code. This is because a delete or replace will be processed immediately, and the deleted or replaced node will no longer be available to the query... However, an expression like the following [see sample code in link] is safe as it only modifies the current iteration variable...
我正在尝试删除 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 = '']
它似乎没有更新文件,但我不确定为什么?
您编写的代码应该删除两个 <text>
元素 - 而不是空的 <paragraph>
元素。让我们暂时搁置这个问题,弄清楚为什么您的代码对源文件没有 any 影响。
首先,你确定它没有任何效果吗?根据您的编辑环境,您可能需要关闭并重新打开 text.xml
文档才能看到更改。
一旦您确定文档确实没有被修改,我猜想您的 doc()
函数没有正确 select 正确地编辑文档。要排除故障,请尝试提供文档的完整绝对路径,例如 doc('/db/text.xml')
或 doc('/db/apps/my-app/text.xml')
.
一旦确认您正在正确寻址文件,使用 XPath 确认您正在 selecting 所需的节点,例如,doc('/db/test.xml')/root/text/paragraph[. = '']
到 select 空段落.
一旦您能够看到所需的节点,我建议您使用 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 段 - 您应该始终尝试使您的更新尽可能接近更新的目标节点。
... be cautious when deleting or replacing nodes that are still being used by enclosing code. This is because a delete or replace will be processed immediately, and the deleted or replaced node will no longer be available to the query... However, an expression like the following [see sample code in link] is safe as it only modifies the current iteration variable...