Возможные дубликаты:
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.