如何将对象转换为节点

chr*_*lly 4 javascript xml xpath marklogic marklogic-8

我想使用一些文档属性(在xml中)作为节点,以便我可以使用子元素.到目前为止,我有:

var counts = [];
for (var p of xdmp.documentProperties(uris)) {
    var isANode = p instanceof Node; // false (actually true - see edit)

    var count = xdmp.xqueryEval('fn:count(' + p + '//data)')
    counts.push(count)
}
counts
Run Code Online (Sandbox Code Playgroud)

我在MarkLogic文档中看过nodebuilder示例,我想使用该接口.例如

myNode.xpath('//data')
var children = myNode.childNodes()
Run Code Online (Sandbox Code Playgroud)

而不是使用XPath进行评估有没有办法将对象转换为节点?或者,有没有更好的方法来使用Server Side JavaScript中的现有XML?

在XQuery中我可以使用,xdmp:tranform-to-json()但SJS中没有提供该功能.

编辑:

在我尝试提供干净的代码示例时,我遗漏了重要信息.我的代码结构如下:

for (var uri of cts.uriMatch('/pattern/*')) {
    var p = xdmp.documentProperties(uri);
    var isANode = p instanceof Node; // false
    // ...
}
Run Code Online (Sandbox Code Playgroud)

代替

for (var p of xdmp.documentProperties(cts.uriMatch('/pattern/*'))) {
    var isANode = p instanceof Node; // true
    // ...
}
Run Code Online (Sandbox Code Playgroud)

返回的类型ValueIterator相当于XQuery序列,可以使用以下方法访问:

xdmp.documentProperties(uri).next().value
Run Code Online (Sandbox Code Playgroud)

小智 7

这在QConsole中对我有用:

var uris = ['/test.xml', '/test2.xml'];
var counts = [];
for (var p of xdmp.documentProperties(uris)) {
    counts.push(fn.count(p.xpath('//data')))
}
counts
Run Code Online (Sandbox Code Playgroud)

在我的测试中,每个p都是一个Node.我用xquery脚本创建了一些示例数据.

let $test-data := (
  <priority>
    <data>hello</data>
  </priority>,
  <status>
    <data>hi</data>
  </status>
)
return
(
  xdmp:document-set-properties("/test.xml", $test-data),
  xdmp:document-set-properties("/test2.xml", $test-data)
)
Run Code Online (Sandbox Code Playgroud)