Проблема xquery для получения данных от дочерних узлов, где найдено соответствующее значение - PullRequest
0 голосов
/ 23 мая 2018

У меня проблема с Xquery.Ниже приведен пример xml, где я применяю xquery для получения значения Price на основе Author и года.Однако запрос возвращает все значения из тега Price.

Количество тегов Book не является конечным и может быть от 1 до N.

XML:

<root>
<_1>
<book >
  <author>Vaidyanathan Nagarajan</author>
  <year>2010</year>
  <price>60</price>
</book>
<book >
  <author>Vaidyanathan Nagarajan</author>
  <year>2009</year>
  <price>50</price>
</book>
</_1>
</root>

XQuery:

for $record in /root/*
where  $record/book/year='2009' and $record/book/author='Vaidyanathan Nagarajan'
return 
fn:data($record/book/price)

Вывод: 60 50

Требуемый выход: 50

Спасибо

1 Ответ

0 голосов
/ 24 мая 2018

Ваш текущий XPath /root/* совпадает с /root/_1, а предложение where проверяет, имеет ли этот элемент _1 элемент book, который year равен 2009, и что он имеет элемент book, автор которого являетсяВайдьянатхан Нагараджан.Обратите внимание, что может быть любая книга, которая удовлетворяет любому условию - это не значит, что есть одна книга, которая удовлетворяет обоим этим критериям.Предложение where исключит элементы $record, которые не удовлетворяют критериям условия where, а не отфильтрует элементы $record/book.Затем вы возвращаете оба значения book/price из /root/_1.

Если вам нужен только price из book, который удовлетворяет обоим условиям в предложении where, тогда попробуйтеthis:

for $book in /root/*/book
where  $book/year='2009' and $book/author='Vaidyanathan Nagarajan'
return 
  fn:data($book/price)

Вы также можете достичь того же без FLWOR и просто использовать XPath с фильтром предикатов:

/root/*/book[year='2009' and author='Vaidyanathan Nagarajan']/price/fn:data()
...