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]