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

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

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

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

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

Вы должны отметить для процессора, который вы хотите обработать //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; } 

Выражение, которое вы использовали, означает «выберите каждый элемент 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.