XQuery更新:根据节点是否存在插入或替换不可能?

XQuery更新:根据节点是否存在插入或替换不可能?,xquery,exist-db,basex,xquery-update,Xquery,Exist Db,Basex,Xquery Update,我正在尝试构建简单的XML数据库(在BaseX或eXist db中),但我无法确定如何修改文档中的值: 测试内容如下: <p> <pl> <id>6></id> </pl> </p> 然后我得到错误:[XUST0001]如果表达式:不允许更新表达式 当我尝试声明更新函数时,即使它报告错误: declare namespace testa='test'; declare updatin

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

测试内容如下:

<p>
    <pl>
        <id>6></id>
    </pl>
</p>
然后我得到
错误:[XUST0001]如果表达式:不允许更新表达式

当我尝试声明更新函数时,即使它报告错误:

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)
声明命名空间testa='test';
声明更新函数testa:bid($a,$b)
{
if(存在(/p/pl[id=6]/name)=true)
然后将节点thenname插入/p/pl[id=6]
其他的
};
测试:投标(0,0)
错误:[XUST0001]如果表达式:不允许更新表达式。

我从BaseX6.5.1包中得到了这些错误

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


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

@Qiqi:@Alejandro是正确的。如果表达式的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'
if(存在(/p/pl[id=6]/name))
然后将节点thenname插入/p/pl[id=6]
否则将节点/p/pl[id=6]/name的值替换为“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'
if(存在(/p/pl[id=6]/name))
然后更新insert thenname到/p/pl[id=6]
else用'elsename'更新值/p/pl[id=6]/name
此特定于eXist的XQuery更新语法记录在上。此语法是在W3CXQuery更新规范达到其当前状态之前开发的。eXist团队计划很快使eXist完全符合W3C规范,但与此同时,上面的文档将帮助您实现使用eXist所需的功能

还要注意,示例代码在pl和id元素中包含一个输入错误。有效的XML版本应为:

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

6.


首先,奇怪的是,XQuery引擎没有抱怨使用上下文节点的表达式。第二,如果出于某种原因,您需要
xs:boolean
的true和false实例,那么应该使用
true()
false()
函数,而不是
child::true
缩写形式。。。但我认为你不需要这个。只需使用
exists()
result,它是一个布尔值。根据@joewiz的existDB重新标记不是XQuery更新工具标准的XQuery引擎。
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'
<p>
  <pl>
    <id>6</id>
  </pl>
</p>