Re: XPath avg(), min(), max() functions not found
| From: | Rob Richards | Date: | Thu, 08 Jun 2006 13:46:51 +0000 |
| Subject: | Re: XPath avg(), min(), max() functions not found | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-237609@lists.php.net to get a copy of this message | ||
Hi Alex,
Alex wrote:
Hi all. I'm trying to use XPath avg(), min() and max() functions
without success. Others functions like count() or sum() works correctly.
Here is the code I'm using (PHP 5.1):
<?php
$xml_str = '
<stats>
<cards>
<card name="My card">
<type name="visits">25</type>
<type name="clicks">7</type>
</card>
<card name="My other card">
<type name="visits">50</type>
<type name="clicks">3</type>
</card>
</cards>
</stats>
';
$xml_doc = new DOMDocument();
$xml_doc->loadXML($xml_str);
$xpath = new DOMXPath($xml_doc);
$cards_avg = $xpath->evaluate("avg(//card/type[@name='visits'])");
var_dump($cards_avg);
$cards_sum = $xpath->evaluate("sum(//card/type[@name='visits'])");
var_dump($cards_sum);
?>
min(), max() and avg() don't exist in XPath 1.0 which is the version implemented in libxml2. You need to calculate these yourself. For example:
/* Find the average */
$cards_avg = $xpath->evaluate("sum(//card/type[@name='visits']) div count(//card/type[@name='visits'])");
var_dump($cards_avg);
$cards_sum = $xpath->evaluate("sum(//card/type[@name='visits'])");
var_dump($cards_sum);
/* Find lowest visits */
$cards_min_nodes = $xpath->query("//card/type[@name='visits']/text()");
$min = NULL;
foreach ($cards_min_nodes AS $node) {
$val = (int)$node->nodeValue;
if (is_null($min) || $min > $val) {
$min = $val;
}
}
print 'Minimum Visits: '.$min."\n";
/* Find maximum visits */
$cards_max_nodes = $xpath->query("//card/type[@name='visits']/text()");
$max = NULL;
foreach ($cards_max_nodes AS $node) {
$val = (int)$node->nodeValue;
if (is_null($min) || $max < $val) {
$max = $val;
}
}
print 'Maximum Visits: '.$max."\n";
Rob
--
rrichards@ctindustries.net
author of Pro PHP XML and Web Services from Apress