仅通过传递部分节点名称获取子节点的XPath
Get XPath of Child node only by passing partial node name
我有以下 XML 存储在 MarkLogic 中,
<testDoc>
<test>
<test1>test1</test1>
<test2>test2</test2>
<test3>test3</test3>
</test>
</testDoc>
我的要求是只获取子节点的 xpath,如果我通过 test(partial node name) 到我的 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")]
我有以下 XML 存储在 MarkLogic 中,
<testDoc>
<test>
<test1>test1</test1>
<test2>test2</test2>
<test3>test3</test3>
</test>
</testDoc>
我的要求是只获取子节点的 xpath,如果我通过 test(partial node name) 到我的 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")]