Pet*_*trV 3 xquery xquery-update exist-db basex
我正在尝试构建简单的XML数据库(在BaseX或eXist-db中),但我无法确定如何修改文档中的值:
内容很简单,因为测试:
<p>
<pl>
<id>6></id>
</pl>
</p>
Run Code Online (Sandbox Code Playgroud)
我正在尝试构建类似函数的东西,<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'
Run Code Online (Sandbox Code Playgroud)
我收到错误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/>
Run Code Online (Sandbox Code Playgroud)
然后我明白了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)
Run Code Online (Sandbox Code Playgroud)
Error: [XUST0001] If expression: no updating expression allowed.
我从BaseX 6.5.1包中得到了这些错误.
那么如果可能的话,如何以简单的方式修改值呢?如果我直接调用insert,则可能存在多个具有相同值的元素.如果我调用replace,它将在节点不存在时失败.如果我在插入/替换之前删除节点,那么我可以销毁我不想要的子节点.
在大多数SQL数据库,这些都是很简单的任务(如MySQL" 取代 "命令).
@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'
Run Code Online (Sandbox Code Playgroud)
请注意,eXist-db的XQuery Update功能目前是特定于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'
Run Code Online (Sandbox Code Playgroud)
这个特定于eXist的XQuery Update语法记录在http://exist-db.org/update_ext.html上.此语法是在W3C XQuery Update规范达到其当前状态之前开发的.eXist团队计划尽快使eXist完全符合W3C规范,但与此同时,如果您使用eXist,上述文档可帮助您实现所需.
另请注意,您的示例代码在pl和id元素中包含拼写错误.有效的XML版本是:
<p>
<pl>
<id>6</id>
</pl>
</p>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21373 次 |
| 最近记录: |