I'm not asking a question actually. I signed up stackoverflow to give something back to a community that has helped me so many times.
If you are using XSLT 1.0 there are no built-in time calculations. I came up with this to convert seconds into minutes and hours. I hope this helps someone!
<xsl:template name="format-duration">
<xsl:param name="value" />
<xsl:variable name="minutes" select="floor($value div 60) mod 60" />
<xsl:variable name="seconds" select="$value mod 60" />
<xsl:variable name="hours" select="floor($value div 3600)" />
<xsl:if test="$hours">
<xsl:if test="$hours < 10">
<xsl:text>0</xsl:text>
</xsl:if>
<xsl:value-of select="$hours" />
<xsl:text>:</xsl:text>
</xsl:if>
<xsl:if test="$minutes">
<xsl:if test="$minutes < 10">
<xsl:text>0</xsl:text>
</xsl:if>
<xsl:value-of select="$minutes" />
<xsl:text></xsl:text>
</xsl:if>
<xsl:if test="$minutes and $seconds">
<xsl:text>:</xsl:text>
</xsl:if>
<xsl:if test="$seconds">
<xsl:value-of select="$seconds" />
<xsl:text></xsl:text>
</xsl:if>
</xsl:template>
EDIT: Do you have any other methods to achieve the same?
Firt of all, thank you for your contribution. There are, however, a few issues with this implementation. The seconds output doesn't take the leading 0 into account, but even if that's fixed, the output can be ambiguous if any of the figures happens to be 0. For example, the inputs
36005
,605
, and36300
all produce the result10:05
.Likewise if two of the figures happen to be zero. The input
36000
produces the output10:
, and the inputs600
and10
both produce the result10
.Here is how I would go about implementing this functionality:
This way, hours are only displayed if they are non-zero or optionally turned on, and seconds are included by default, but can be optionally omitted by using the parameter values. This should reduce the ambiguity about what a time is supposed to represent.
It also allows omitting the
value
parameter if the value you want to format is the current context node.Converting number of seconds to time (HH:MM:SS) in XSLT 1.0: