3

我认识到使用 BaseX 客户端执行的 ( insert/ delete)-XQueries 总是返回一个空字符串。我觉得这非常令人困惑或不直观。

有没有办法在不再次查询数据库的情况下确定查询是否“成功”(并使用可能有问题的“传递”逻辑,例如“如果我删除了一个节点,XML 中必须有 'oldNodeCount-1' 节点”) ?

4

1 回答 1

3

XQuery Update 语句不返回任何内容——这就是它们的定义方式。但是你不是唯一一个不喜欢这些限制的人,BaseX 添加了两种方法来解决这个限制

返回结果

默认情况下,查询结果中不能混合使用不同类型的表达式。查询的最外层表达式必须是更新或非更新表达式的集合。但是有两种出路:

  • BaseX 特有的update:output()函数弥补了这一差距:它在运行时缓存其参数的结果,并在处理完所有更新后返回它们。以下示例执行更新并返回成功消息:

    update:output("Update successful."), insert node <c/> into doc('factbook')/mondial
    
  • 使用该MIXUPDATES选项,将关闭所有更新约束。返回的节点将在通过更新表达式进行修改之前被复制。如果在转换表达式中返回项目,则会引发错误。

如果要修改主存中的节点,可以使用transform 表达式.

转换表达式对您没有帮助,因为您似乎修改了磁盘上的数据。启用MIXUPDATES允许您同时更新文档并返回某些内容,例如运行类似

let $node := <c/>
return ($node, insert node $node into doc('factbook')/mondial)

MIXUPDATES允许您返回可以进一步处理的东西。结果在返回之前被复制,如果您运行多个更新操作并且没有得到预期的结果,请确保您了解了挂起更新列表的概念。

db:output()函数故意破坏了它的接口契约:它被定义为一个更新函数(没有任何输出),但同时它将一些信息打印到查询信息中。您无法进一步处理这些结果,但输出可以帮助您调试一些问题。

待更新列表

两种方式,您都无法从更新中立即获得结果,您必须自己添加一些东西——并且要知道在应用挂起的更新列表之前更新是不可见的,即。查询完成后。

兼容性

显然,这些选项是 BaseX 特定的。如果您强烈需要兼容和标准的 XQuery,则不能使用这些表达式。

于 2016-05-01T07:52:55.270 回答