XPATH. Как выбрать узел, у которого есть дочерний узел с заданным атрибутом с максимальным значением?

Например:

<a>
  <b>
    <c1>c1 text</b1>
    <c2 c2attr="10">c2 text</b2>
    <c3>c3 text</b3>
  </b>
  <b>
    <c1>c1 text</b1>
    <c2 c2attr="5">c2 text</b2>
    <c3>c3 text</b3>
  </b>
</a>

Я хочу выбрать элемент <b>, у которого есть дочерний элемент <c2> с максимальным атрибутом c2attr; в данном примере первый (10 > 5).

я пытался

/a/b[not(c2@c2attr <= preceding-sibling::c2@c2attr) and not(c2@c2attr <=following-sibling::c2@c2attr)]

Но PHP говорит, что он недействителен...


person Oriol    schedule 27.01.2013    source источник


Ответы (1)


Вам не хватает косой черты перед знаками @, и вам нужно искать preceding-sibling элементов с именами b, а не c2:

/a/b[not(c2/@c2attr <= preceding-sibling::b/c2/@c2attr) and not(c2/@c2attr <=following-sibling::b/c2/@c2attr)]

Однако этот вид проверки будет квадратичным по количеству b элементов, поскольку он сравнивает каждый b с каждым другим b. Было бы более эффективно просто извлечь все элементы b, а затем выполнить итерацию по ним (один раз) с помощью PHP-кода, отслеживая самое высокое значение c2attr, которое вы видели до сих пор, и к какому b оно принадлежит. Это было бы линейным, а не квадратичным.

person Ian Roberts    schedule 27.01.2013