Функция для достижения "Элемент не имеет этого ребенка"? - PullRequest
2 голосов
/ 31 июля 2009

Я хочу получить документы в коллекции, которые удовлетворяют тому, что данный элемент не имеет определенного дочернего элемента. Например, из двух «документов», приведенных ниже, я хочу выбрать документ 2, поскольку он имеет дочерний элемент, но документ 1, поскольку его нет.

Документ 1 :

<doc>
 <element>
  <child/>
 </element>
</doc>

doc2

<doc>
 <element>
  <other-child/>
 </element>
</doc>

Я пытался сделать это:

for $item in collection('/db/collection')
where not($item//child)
return $item

Однако по какой-то причине это не работает. Я также пробовал различные комбинации exists, функции последовательности и т. Д., Но не смог получить желаемый результат.

Чтобы прояснить, тест not($item//child), похоже, не делает то, что я думаю, что он будет делать. Приведенный выше запрос возвращает каждый документ в моей коллекции, имеет ли он элемент или нет. Обратное работает, однако:

for $item in collection('/db/collection')
where $item//child
return $item

Этот запрос возвращает именно те документы, которые имеют дочерний элемент.

Что дает?

Ответы [ 3 ]

3 голосов
/ 11 марта 2010

Я думаю, вам нужно использовать not () и существующие () для достижения желаемых результатов. Итак, я думаю, что вы хотите сделать что-то вроде:

for $item in collection('/db/collection') return
    if (not(exists($item//child))) then $item
    else ()

О вашей проблеме с пространством имен: если ваш документ использует пространство имен, то в вашем выражении XQuery должно быть соответствующее объявление пространства имен, например declare namespace ns="some_uri";

Надеюсь, это поможет.
-tjw

0 голосов
/ 25 августа 2009

Чтобы обойти ошибку, как на данный момент:

for $item in collection('/db/collection') 
return 
  if ($item//child) then
    $item
  else 
    ()
0 голосов
/ 31 июля 2009

Кажется, что это ошибка в механизме XQuery eXist (1.2.6) при использовании XML-документов с пространством имен, поскольку он работает с документами без пространства имен и с последним снимком SVN.
Облом.

...