Xquery - использование переменной для поиска узла с префиксом пространства имен - PullRequest
0 голосов
/ 06 апреля 2011

Я пытаюсь найти узел (с префиксом пространства имен), используя переменные в моем 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 ]

1 голос
/ 06 апреля 2011

Это 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>
0 голосов
/ 06 апреля 2011

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

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

Если это:

return doc('xyz')/entry[*[local-name() = $type and namespace-uri() = $libx_ns]][1]
...