2

我想知道一个 XML 文档是否已经构建(例如使用xdmp:unquote)或已从数据库中检索。我尝试过的一种方法是检查 document-uri 属性

declare variable $doc as document-node() external;

if (fn:exists(fn:document-uri($doc))) then
  'on database'
else
  'in memory'

这似乎工作得很好,但我在 MarkLogic 文档中看不到任何保证这一点的东西。这种方法可靠吗?我应该使用其他一些技术吗?

4

3 回答 3

2

我认为这种行为已经稳定了一段时间。您也可以随时检查 URI,只要您希望它来自当前数据库:

xdmp:exists(fn:doc(fn:document-uri($doc)))

或者,如果您在更新上下文中并且需要 ACID 保证,请使用fn:exists.

真正的测试是尝试调用xdmp:node-replace或类似的方法,并捕获预期的错误。那些节点级别的更新函数不适用于构造的节点。但这需要更新上下文,并且可能很难以稳健的方式实现。

于 2012-08-23T00:26:20.750 回答
1

如果你的 XML 文档是in-memeory,你可以使用in-mem-updateAPI

import module namespace mem = "http://xqdev.com/in-mem-update" at "/MarkLogic/appservices/utils/in-mem-update.xqy";

如果您的 XML 文档存在于您的数据库中,您可以使用fn:exists()fn:doc-available()

于 2015-04-08T14:28:36.613 回答
0

In-memory 或 In-Db 的真正测试是xdmp:node-replace

如果您能够替换、更新、删除一个节点,那么它在数据库中,否则如果它抛出异常,那么它不在数据库中。

现在有两种情况

1.您的文档根本没有创建: 您可以使用fn:empty()它来检查它是否已创建。

2. 您的文档已创建并在内存中: 如果fn:empty()返回 false 并且 xdmp:node-replace 抛出异常,则它在内存中

于 2015-03-23T12:45:42.670 回答