XQuery: как получить элемент, предшествующий выбранному в файле XML?

Хорошо, если у меня есть, например:

<entries>
  ...
  <entry id="34" weight="83">...</entry>
  <entry id="35" weight="21">...</entry>
  ...
</entries>

По какой-то причине я получаю запись с идентификатором 35: let $entry := //entry[xs:integer(./@weight)=21]. Как я могу просто получить предыдущую запись (ID 34)?


person Rob    schedule 25.12.2012    source источник


Ответы (2)


Используйте ось XPath preceding-sibling для извлечения всех предыдущих братьев и сестер, а затем ограничьте набор результатов последним.

(//entry[xs:integer(./@weight)=21]/preceding-sibling::*)[last()]

В зависимости от вашего набора данных и реализации XQuery может быть быстрее пойти наоборот: найти <entry/> элементов, за которыми следует один, удовлетворяющий условию.

//entry[./following-sibling::*[1][xs:integer(./@weight)=8]]
person Jens Erat    schedule 25.12.2012

//entry[xs:integer(@weight)=21]/preceding-sibling::entry[1]

Ось предыдущего брата отсчитывается в обратном порядке. [1] обозначает непосредственно предшествующего брата.

person Tomalak    schedule 25.12.2012