gpt4 book ai didi

XQuery 更新 : insert or replace depending if node exists not possible?

转载 作者:行者123 更新时间:2023-12-01 15:15:20 26 4
gpt4 key购买 nike

我正在尝试构建简单的 XML 数据库(在 BaseX 或 eXist-db 中),但我无法弄清楚如何修改文档中的值:

测试内容很简单:

<p>
<pl>
<id>6></id>
</pl>
</p>

我正在尝试构建类似于将元素插入 <pl> 的函数如果该元素不存在或如果存在则替换它。但是 XQuery 给我带来了麻烦:

当我尝试使用 if-then-else 逻辑时:

if (exists(/p/pl[id=6]/name)=false)
then insert node <name>thenname</name> into /p/pl[id=6]
else replace value of node /p/pl[id=6]/name with 'elsename'

我收到错误 Error: [XUDY0027] Replace target must not be empty .显然我很困惑,为什么在这两种情况下都会评估 else 部分,从而导致错误。当我清空其他部分时:

if (exists(/p/pl[id=6]/name)=true)
then insert node <name>thenname</name> into /p/pl[id=6]
else <dummy/>

然后我得到 Error: [XUST0001] If expression: no updating expression allowed .

当我尝试通过声明更新功能时,即使这样它也会报告错误:

declare namespace testa='test';

declare updating function testa:bid($a, $b)
{
if (exists(/p/pl[id=6]/name)=true)
then insert node <name>thenname</name> into /p/pl[id=6]
else <dummy/>
};

testa:bid(0,0)

Error: [XUST0001] If expression: no updating expression allowed.

我从 BaseX 6.5.1 包中得到了这些错误。

那么,如果可能的话,我怎样才能以简单的方式修改值呢?如果我直接调用 insert,可能会有多个元素具有相同的值。如果我调用 replace,它将在节点不存在时失败。如果我在插入/替换之前删除节点,那么我可以破坏我不想要的子节点。

在大多数 SQL 数据库中,这些都是非常简单的任务(例如 MYSQL 的“replace”命令)。

最佳答案

@Qiqi:@Alejandro 是对的。您的 if 表达式不正确 XQuery 语法:

if (exists(/p/pl[id=6]/name))
then insert node <name>thenname</name> into /p/pl[id=6]
else replace value of node /p/pl[id=6]/name with 'elsename'

请注意,eXist-db 的 XQuery 更新功能目前是特定于 eXist 的实现,因此在 eXist(当前)1.4.x 和 1.5dev 中,您需要:

if (exists(/p/pl[id=6]/name))
then update insert <name>thenname</name> into /p/pl[id=6]
else update value /p/pl[id=6]/name with 'elsename'

此 eXist 特定的 XQuery 更新语法记录在 http://exist-db.org/update_ext.html 上.此语法是在 W3C XQuery 更新规范达到其当前状态之前开发的。 eXist 团队计划很快使 eXist 完全符合 W3C 规范,但与此同时,如果您使用 eXist,上面的文档应该可以帮助您实现所需的目标。

另请注意,您的示例代码在 pl 和 id 元素中包含拼写错误。有效的 XML 版本是:

<p>
<pl>
<id>6</id>
</pl>
</p>

关于XQuery 更新 : insert or replace depending if node exists not possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5335046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com