PHP XPath, выбирающий последний элемент соответствия
Возможные дубликаты:
PHP SimpleXML. Как получить последний элемент?
XSLT Выберите все узлы, содержащие определенную подстроку
Мне нужно найти содержимое последнего элемента span с классом 'myClass'. Я пробовал различные комбинации, но не могу найти ответ.
//span[@class='myPrice' and position()=last()]
Это возвращает все элементы с классом "myClass", я предполагаю, что это потому, что каждый найденный элемент является последним на момент обработки, но мне просто нужен фактический последний элемент соответствия.
Ответы
Ответ 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.