A started at 03:12:10
A ended at 03:20:20
B started at 03:20:25
B ended at 03:22:21
C started at 03:22:23
C ended at 03:22:55
D started at 03:22:57
D ended at 03:23:21
E started at 03:23:25
E ended at 03:24:40
Here A, B, C etc. are some events, and they start at a particular time and end at another time.
I need to produce an output like following:
D : 0-0-24
C : 0-0-32
E : 0-1-15
B : 0-1-56
A : 0-8-10
i.e., events sorted by the time they took (in ascending order of durations). The duration format in the output is, hr-min-sec.
The following XSLT 2.0 stylesheet worked well for this problem,
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="text" /> <xsl:variable name="time-data" select="tokenize(unparsed-text('test.txt', 'UTF-8'), '\r?\n')" /> <xsl:template match="/"> <xsl:variable name="temp-data"> <xsl:for-each select="$time-data"> <xsl:variable name="val" select="normalize-space(.)" /> <xsl:variable name="pos" select="position()" /> <xsl:if test="position() mod 2 = 1"> <data key="{tokenize($val, '\s')[1]}"> <xsl:value-of select="xs:time(tokenize($time-data[$pos + 1], '\s')[last()]) -xs:time(tokenize($val, '\s')[last()])" /> </data> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:for-each select="$temp-data/*"> <xsl:sort select="xs:dayTimeDuration(.)" /> <xsl:variable name="hr" select="hours-from-duration(.)" /> <xsl:variable name="min" select="minutes-from-duration(.)" /> <xsl:variable name="sec" select="seconds-from-duration(.)" /> <xsl:value-of select="@key" /> : <xsl:value-of select="concat($hr, '-', $min, '-', $sec)" /> <xsl:text> </xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
The following XSLT sort instruction worked, well for this use case:
<xsl:sort select="xs:dayTimeDuration(.)" order="descending" />
I've used Saxon to solve this.
If anybody bumps by this post, and could think of a better solution (particularly written in a more functional style, and avoiding the temporary tree), I would be very glad to know that.
No comments:
Post a Comment