我正在尝试构建简单的 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 包中得到了这些错误。
那么如果可能的话,我怎样才能以一种简单的方式修改值呢?如果我直接调用插入,则可能有多个相同值的元素。如果我调用replace它会在节点不存在时失败。如果我在插入/替换之前删除节点,那么我可以销毁我不想要的子节点。
在大多数 SQL 数据库中,这些都是非常简单的任务(如 MYSQL 的“替换”命令)。