xquery: найти, если родительский узел имеет дочерний узел другого пространства имен - PullRequest
0 голосов
/ 23 мая 2011

Я пытаюсь проверить, есть ли у узла пространства имен 'X' дочерний узел другого пространства имен 'Y'.Я пробовал следующий xquery:

declare namespace atom = "http://www.w3.org/2005/Atom";
declare namespace libx = "http://libx.org/xml/libx2";

let $doc := <node><entries xmlns="http://www.w3.org/2005/Atom" xmlns:libx="http://libx.org/xml/libx2"> 
             <libx:book-entry><book>Book 1</book><author>Author 1 PQR</author><title>Title 1</title></libx:book-entry> 
             <libx:car-entry><car>Car 1</car><model>Model 1</model><price>Price 1 PQR</price></libx:car-entry>
           </entries></node>, 
    $types := <types xmlns="http://libx.org/xml/libx2"><type>book-entry</type></types>, 
    $key := 'PQR'

for $type in $types/libx:type
return
   for $entry in $doc/atom:entries/*[name() eq $type]
     return $entry

Я ожидаю, что результат будет: <libx:book-entry><book>Book 1</book><author>Author 1 PQR</author><title>Title 1</title></libx:book-entry>.Но запрос возвращает null, так как функция name не учитывает другое пространство имен.Есть ли другая функция xquery, кроме name (), которая принимает параметр пространства имен, который даст желаемый результат.

Спасибо, Sony

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

Выражение

$X[namespace-uri() != */namespace-uri()]

выберет все элементы в $ X, у которых есть хотя бы один дочерний элемент, чей URI пространства имен не равен URI пространства имен родительского элемента. Это редкий пример использования "! =" В качестве неявного экзистенциала (true, если это верно для любого члена последовательности.)

0 голосов
/ 23 мая 2011

Вы можете использовать функцию local-name() для сопоставления только локальных имен элементов (как вы перечислили их в $ types ).

Или если вы хотите быть действительно конкретнымикомбинация функций local-name() и namespace-uri() для соответствия как имени элемента, так и URI пространства имен.

...