Подтвердить что ты не робот

PHP XPath, выбирающий последний элемент соответствия

Возможные дубликаты:
PHP SimpleXML. Как получить последний элемент?
XSLT Выберите все узлы, содержащие определенную подстроку

Мне нужно найти содержимое последнего элемента span с классом 'myClass'. Я пробовал различные комбинации, но не могу найти ответ.

//span[@class='myPrice' and position()=last()]

Это возвращает все элементы с классом "myClass", я предполагаю, что это потому, что каждый найденный элемент является последним на момент обработки, но мне просто нужен фактический последний элемент соответствия.

4b9b3361

Ответ 1

Вы должны отметить процессор, который вы хотите обработать //span[@class='myPrice'] как текущий набор, а затем применить предикат position() = last() к этому набору.

(//span[@class='myPrice'])[last()]

например

<?php
$doc = getDoc();
$xpath = new DOMXPath($doc);
foreach( $xpath->query("(//span[@class='myPrice'])[last()]") as $n ) {
  echo $n->nodeValue, "\n";
}


function getDoc() {
  $doc = new DOMDOcument;
  $doc->loadxml( <<< eox
<foo>
  <span class="myPrice">1</span>
  <span class="yourPrice">0</span>
  <bar>
    <span class="myPrice">4</span>
    <span class="yourPrice">99</span>
  </bar>
  <bar>
    <span class="myPrice">9</span>
  </bar>
</foo>
eox
  );
  return $doc;
}

Ответ 2

Используемое выражение означает "выберите каждый элемент span при условии, что (a) он имеет @class='myprice' и (b) он является последним дочерним элементом его родителя. Существуют две ошибки:

(1) вам нужно применить фильтр [position()=last()] после фильтрации @class, а не применять его ко всем элементам span

(2) выражение вида //span[last()] означает /descendant-or-self::*/(child::span[last()]), которое выбирает последний дочерний пролет для каждого элемента. Для изменения приоритета необходимо использовать круглые скобки: (//span)[last()].

Таким образом, выражение становится (//span[@class='myPrice'])[last()], как задано VolkerK.