我想知道XML文档是已构建(例如使用xdmp:unquote
)还是已从数据库中检索到。我尝试过的一种方法是检查文档uri属性
declare variable $doc as document-node() external;
if (fn:exists(fn:document-uri($doc))) then
'on database'
else
'in memory'
这似乎已经足够好了,但我在MarkLogic文档中看不到任何东西可以保证这一点。这种方法可靠吗?我应该使用其他技术吗?
我认为这种行为已经稳定了一段时间。您也可以随时检查URI,只要您希望它来自当前数据库:
xdmp:exists(fn:doc(fn:document-uri($doc)))
或者,如果您处于更新上下文中并且需要ACID保证,请使用fn:exists
。
真正的测试是尝试调用xdmp:node-replace
或类似的方法,并捕获预期的错误。这些节点级更新功能不适用于已构建的节点。但这需要更新上下文,并且可能很难以稳健的方式实现。
如果您的XML文档是in-memeory
,则可以使用in-mem-update
API
import module namespace mem = "http://xqdev.com/in-mem-update" at "/MarkLogic/appservices/utils/in-mem-update.xqy";
如果数据库中存在XML文档,则可以使用fn:exists()
或fn:doc-available()
In memory或In Db的真正测试是xdmp:node replace。
若你们能够替换、更新、删除一个节点,那个么它就在数据库中;若它抛出异常,那个么就不在数据库中。
现在有两种情况
1.您的文档根本没有创建:您可以使用fn:empty()
来检查它是否已创建。
2.您的文档已创建并在内存中:如果fn:empty()
返回false并且xdmp:node replace抛出异常,则它在内存中