Я провожу последнее время, пытаясь придумать для вас самое элегантное решение. Как вы знаете, max
недоступно в XPath 1.0. Я пробовал несколько разных подходов, большинство из которых кажутся не очень эффективными.
<?php
$doc = new DOMDocument;
$doc->loadXml('<table><tr><td>$12.00</td><td>$24.00</td><td>$13.00</td></tr></table>');
function dom_xpath_max($this, $nodes)
{
usort($nodes, create_function('$a, $b', 'return strcmp($b->textContent, $a->textContent);'));
return $this[0]->textContent == $nodes[0]->textContent;
}
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('php', 'http://php.net/xpath');
$xpath->registerPHPFunctions('dom_xpath_max');
$result = $xpath->evaluate('//table/tr/td[php:function("dom_xpath_max", ., ../td)]');
echo $result->item(0)->textContent;
?>
В качестве альтернативы, вы можете использовать цикл foreach
, чтобы выполнить итерацию по результату более простого выражения XPath (один раз, который выбирает только все элементы TD) и найти наибольшее число.
<?php
...
$xpath = new DOMXPath($doc);
$result = $xpath->evaluate('//table/tr/td');
$highest = '';
foreach ( $result as $node )
if ( $node->textContent > $highest )
$highest = $node->textContent;
echo $highest;
?>
Вы также можете использовать класс XSLTProcessor и документ XSL, который использует функцию math: max из exslt.org , но я попробовал это и не смог заставить его работать правильно из-за знаки доллара ($).
Я протестировал оба решения, и они хорошо сработали для меня.