Xquery - использование переменной для поиска узла с префиксом пространства имен

Я пытаюсь найти узел (с префиксом пространства имен), используя переменные в моем xquery следующим образом:

declare variable $libx_ns as xs:string external;
declare namespace libx=$libx_ns;
declare variable $type as xs:string external;

return doc('xyz')/entry[libx:{$type}][1]

Значения параметров: $libx_ns = 'http://libx.org/xml/libx2', $type = libapp. Когда я запускаю этот xquery, я вижу следующую ошибку:

[XPST0003] Неполное выражение.

Приведенный выше код работает, если я изменю последнюю строку следующим образом:

return doc('xyz')/entry[libx:libapp][1]

Цель состоит в том, чтобы использовать строковую переменную (например, $ type) для имени узла, а не жестко связывать его (например, libapp). Как бы я это сделал?

Образец XML-документа:

<entry xmlns:libx="http://libx.org/xml/libx2">
  <libx:libapp> First libapp </libx:libapp>
  <libx:libapp> Second libapp </libx:libapp>
</entry>

Спасибо Sony

2 ответа

Решение

Это XQuery:

declare variable $namespace-uri as xs:string external;
declare variable $local-name as xs:string external;

/entry[*[node-name(.) eq QName($namespace-uri,$local-name)]]

С этим входом:

<entry xmlns:libx="http://libx.org/xml/libx2">
    <libx:libapp> First libapp </libx:libapp>
    <libx:libapp> Second libapp </libx:libapp>
</entry>

настройка $namespace-uri как 'http://libx.org/xml/libx2' а также $local-name как libapp, выход:

<entry xmlns:libx="http://libx.org/xml/libx2">
    <libx:libapp> First libapp </libx:libapp>
    <libx:libapp> Second libapp </libx:libapp>
</entry>

Если пространство имен не является критической разницей, вы можете попробовать:

return doc('xyz')/entry[*[local-name() = $type]][1]

Если это:

return doc('xyz')/entry[*[local-name() = $type and namespace-uri() = $libx_ns]][1]
Другие вопросы по тегам