xml - XSLT 1.0: find the maximum value from given date and time -
hi all,
have xml event in following format (month,date,year,hour,minute,seconds am/pm). mention that, don't have control on generated xml. need find maximum or latest "dateevent" , select corresponding "eventname". xml looks like
<?xml version="1.0" standalone="no"?> <day> <day-event> <eventname>test1</eventname> <dateevent>1/30/2014 7:15:50 am</dateevent> </day-event> <day-event> <eventname>test2</eventname> <dateevent>4/29/2015 6:55:58 pm</dateevent> </day-event> <day-event> <eventname>test3</eventname> <dateevent>12/29/2014 9:33:24 pm</dateevent> </day-event> </day> in xml have select latest "dateevent"(ie) 4/29/2015 6:55:58 pm , select corresponding "eventname"(ietest2). suggestions on how this..? application uses sax parser make transformation. tried sorting approach wasn't successful. result should
eventname 4/29/2015 6:55:58 pm
any suggestions on how approach ?
thanks
xslt 1.0 has no concept of dates (and xslt 2.0 recognize dates in iso-8601 format). need in 2 steps:
- convert dates sortable string in form of yyymmddhhmmss. further complicated necessity convert 12-hour time 24-hour format.
- sort resulting nodes , output first (or last, depending on sort order) 1 of these.
xslt 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/day"> <!-- first pass --> <xsl:variable name="events"> <xsl:for-each select="day-event"> <event name="{eventname}" date="{dateevent}"> <xsl:call-template name="convert-date"> <xsl:with-param name="datestring" select="dateevent"/> </xsl:call-template> </event> </xsl:for-each> </xsl:variable> <!-- output --> <output> <xsl:for-each select="exsl:node-set($events)/event"> <xsl:sort select="." order="descending"/> <xsl:if test="position()=1"> <eventname> <xsl:value-of select="@name" /> </eventname> <dateevent> <xsl:value-of select="@date" /> </dateevent> </xsl:if> </xsl:for-each> </output> </xsl:template> <xsl:template name="convert-date"> <xsl:param name="datestring"/> <xsl:variable name="date" select="substring-before($datestring, ' ')" /> <xsl:variable name="time" select="substring-before(substring-after($datestring, ' '), ' ')" /> <xsl:variable name="m" select="substring-before($date, '/')" /> <xsl:variable name="d" select="substring-before(substring-after($date, '/'), '/')" /> <xsl:variable name="y" select="substring-after(substring-after($date, '/'), '/')" /> <xsl:variable name="h12" select="substring-before($time, ':')"/> <xsl:variable name="m" select="substring-before(substring-after($time,':'), ':')"/> <xsl:variable name="s" select="substring-after(substring-after($time,':'), ':')"/> <xsl:variable name="pm" select="contains($datestring,'pm')"/> <xsl:variable name="h" select="$h12 mod 12 + 12*$pm"/> <xsl:value-of select="format-number($y, '0000')" /> <xsl:value-of select="format-number($m, '00')" /> <xsl:value-of select="format-number($d, '00')" /> <xsl:value-of select="format-number($h, '00')" /> <xsl:value-of select="format-number($m, '00')" /> <xsl:value-of select="format-number($s, '00')" /> </xsl:template> </xsl:stylesheet> result
?xml version="1.0" encoding="utf-8"?> <output> <eventname>test2</eventname> <dateevent>4/29/2015 6:55:58 pm</dateevent> </output>
Comments
Post a Comment