我已经将以下XML存储在MarkLogic中,

<testDoc>
    <test>
        <test1>test1</test1>
        <test2>test2</test2>
        <test3>test3</test3>
    </test>
</testDoc>


我的要求是仅获得子节点的xpath,例如,如果我通过test(部分节点名称)到我的xquery,那么我期望

/testDoc/test/test1
/testDoc/test/test2
/testDoc/test/test3


但是我的xquery返回了

/testDoc
/testDoc/test
/testDoc/test/test1
/testDoc/test/test2
/testDoc/test/test3


我在qconsole上执行的XQuery是

 xquery version "1.0-ml";
 let $xml := document { fn:doc("/test/testDoc")}
 let $elem-name := "test"
 let $elems := $xml//*[local-name()[contains(lower-case(.), lower-case($elem-name))]]
 return $elems ! xdmp:path(.)


请指导我达到要求。

最佳答案

我不确定您是要尝试在特定深度还是仅叶子节点进行匹配。如果只想获取叶节点,则可以添加一个谓词以检查是否没有子元素

[fn:not(./*)]


您还可以重写谓词并使用fn:matches()进行匹配

let $elems := $xml//*[fn:not(./*)][fn:matches(fn:local-name(.), $elem-name, "i")]

10-06 07:32