在XPath中,如何获得具有最高值的节点?例如
<tr>
<td>$12.00</td>
<td>$24.00</td>
<td>$13.00</td>
</tr>
将返回$ 24.00。
我正在使用PHP DOM,所以这将是XPath版本1.0。
答案 0 :(得分:2)
首先,编写单个XPath查询以返回包含除$
之类的数字之外的字符的最高值将极其困难或不可能。但是如果你考虑排除$
之类的
<tr>
<td>12.00</td>
<td>24.00</td>
<td>13.00</td>
</tr>
然后您可以编写单个XPath查询来检索最高值的节点。
//tr/td[not(preceding-sibling::td/text() > text() or following-sibling::td/text() > text())]
此查询会向您<td>
返回值24.00
。
希望这有帮助。
答案 1 :(得分:2)
我花了最后一点时间试图为您提供最优雅的解决方案。如您所知,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文档,但是我已经尝试过了,并且由于美元符号而无法让它正常工作($ )。
我已经测试了两种解决方案,但它们对我来说效果很好。
答案 2 :(得分:1)
纯XPath 1.0解决方案很难:在XSLT级别,您将使用递归,但这涉及编写函数或模板,因此它排除了纯XPath。在PHP中,我只需将所有数据拉回主机语言并使用PHP代码计算max()。