微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 使用XPath获取最高价值的节点

在XPath中,如何获得具有最高值的节点?例如

<tr>
   <td>$12.00</td>
   <td>$24.00</td>
   <td>$13.00</td>
</tr> 

将返回$24.00.

我正在使用PHP DOM,所以这将是XPath 1.0版.

解决方法:

我花了最后一点努力为你找到最优雅的解决方案.如您所知,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类和一个使用exslt.org中的math:max函数的XSL文档,但我已经尝试过了,并且由于美元符号($)而无法让它正常工作.

我测试了两种解决方案,但它们对我来说效果很好.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。