Xpath expression to retrieve oldest/earliest node

Posted by gkrogers on Stack Overflow See other posts from Stack Overflow or by gkrogers
Published on 2010-06-09T15:34:44Z Indexed on 2010/06/11 6:03 UTC
Read the original article Hit count: 246

Filed under:
|
|
|
|

I have an XML snippet, so:

<STATES>
  <STATE>
    <NAME>Alabama</NAME>
    <ABBREVIATION>AL</ABBREVIATION>
    <CAPITAL>Montgomery</CAPITAL>
    <POPULATION>4661900</POPULATION>
    <AREA>52419</AREA>
    <DATEOFSTATEHOOD>14 December 1819</DATEOFSTATEHOOD>
  </STATE>
  <STATE>
    <NAME>Alaska</NAME>
    <ABBREVIATION>AK</ABBREVIATION>
    <CAPITAL>Juneau</CAPITAL>
    <POPULATION>698473</POPULATION>
    <AREA>663268</AREA>
    <DATEOFSTATEHOOD>1 January 1959</DATEOFSTATEHOOD>
  </STATE>
  <STATE>
    <NAME>Delaware</NAME>
    <ABBREVIATION>DE</ABBREVIATION>
    <CAPITAL>Dover</CAPITAL>
    <POPULATION>885122</POPULATION>
    <AREA>2490</AREA>
    <DATEOFSTATEHOOD>7 December 1787</DATEOFSTATEHOOD>
  </STATE>
</STATES>
<etc, etc.>

I want to retrieve (for example) the capital of the oldest state (i.e. "Dover"). I have managed to get this far:

//STATES/STATE[DATEOFSTATEHOOD='7 December 1787']/CAPITAL/text()

but can't figure out how to say 'DATEOFSTATEHOOD={the earliest DATEOFSTATEHOOD}'.

Can anybody point me in the right direction, please?

SOLUTION: Matt's solution is more or less spot on. I had to reformat the dates (I used YYYYMMDDD) because, as was pointed out, Xpath 1.0 doesn't support the date format I was using. Also, Microsoft's XML library (4.0 and 6.0) returned the whole node list with Matt's expression. Reversing the test fixed that problem, making it return just the earliest node.

So:

//STATES/STATE[(DATEOFSTATEHOOD < //STATES/STATE/DATEOFSTATEHOOD)]/CAPITAL/text()

© Stack Overflow or respective owner

Related posts about Xml

Related posts about xpath