Получить XPath дочернего узла, только передав частичное имя узла - PullRequest
0 голосов
/ 05 сентября 2018

У меня следующий XML хранится в MarkLogic,

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

Мое требование - получить xpath дочерних узлов, например, если я сдаю тест ( частичное имя узла ) в свой xquery, то я ожидаю

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

но мой xquery возвращается,

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

XQuery, который я выполняю на qconsole,

 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(.)

Пожалуйста, помогите мне выполнить мое требование.

1 Ответ

0 голосов
/ 05 сентября 2018

Я не уверен, пытаетесь ли вы сопоставить на определенной глубине или только с листовыми узлами. Если вы хотите получить только конечные узлы, вы можете добавить предикат для проверки отсутствия дочерних элементов

[fn:not(./*)]

Вы также можете переписать свои предикаты и использовать fn:matches() для сопоставления

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