XQuery更新:根据节点是否存在插入或替换不可能?
我正在尝试构建简单的XML数据库(在BaseX或eXist db中),但我无法确定如何修改文档中的值: 测试内容如下: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
<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>