Search code examples
xmlxpathxpath-1.0

How can I use XPath to find the minimum value of an attribute in a set of elements?


If I have XML like:

<foo>
  <bar id="1" score="192" />
  <bar id="2" score="227" />
  <bar id="3" score="105" />
  ...
</foo>

Can I use XPath to find the minimum and maximum values of score?

Edit: The tool i'm using (Andariel ant tasks) doesn't support the XPath 2.0 solution.


Solution

  • Turns out the tool does not support XPath 2.0.

    XPath 1.0 doesn't have the fancy min() and max() functions, so to find these values we need to be a little tricky with the XPath logic, and compare the values on the siblings of the node:

    Maximum:

    /foo/bar[not(preceding-sibling::bar/@score >= @score) 
        and not(following-sibling::bar/@score > @score)]/@score
    

    Minimum:

    /foo/bar[not(preceding-sibling::bar/@score <= @score) 
        and not(following-sibling::bar/@score < @score)]/@score
    

    If embedding these queries in XML files like XSLT or ant scripts, remember to encode < and > as &lt; respecting &gt;.