在BaseX 7.7.2中使用XQuery,我想用一些变量值填充模板节点并将其插入到文档中,并且只返回新创建的节点,而不是我插入的上下文节点。
(: define an "auto-increment" id :)
let $nextId := if( exists( //company/id ) ) then max( //company/id ) + 1 else 1
(: fill the template node (a simplified example node) :)
let $company := <company><id>{ $nextId }</id></company>
(: insert the new node :)
return insert node $company into /companies
这很有效。但是,我不希望它返回/companies
,而只是返回新节点$company
。
但是,如果我将查询更改为以下内容,则它不再起作用。
(: insert the new node; does not work :)
insert node $company into /companies
(: only return the newly created node :)
return $company
为什么在FLWOR语句中我不允许在返回内容之前执行中间更新操作?为什么FLWOR表达式中的返回语句是强制性的?
编辑:
在检查了这个XQuery grammar documentation后,似乎我根本不应该使用FLWOR表达式,而只需使用declare variable
语句代替let
}语句。但是,在这种情况下,我仍然不知道如何返回新创建的节点,如果显然返回一些内容而不使用FLWOR表达式,则可以开始。
默认情况下,任何更新语句(带或不带FLWOR)都会返回完整的文档作为结果。由于我希望这个文档在某些时候可能变得非常大,我不希望每次更新语句都通过网络发送它。
正如您所知,我很难理解XQuery语言中的更新/返回概念。我希望有人可以对这些问题有所了解。