By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
424,687 Members | 2,046 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,687 IT Pros & Developers. It's quick & easy.

An XML question - calculating time total

P: n/a
I would like to produce the following output based on my XML file:

My Album (2005)
Elapsed Time (hh:mm:ss): 00:07:00

Song 1: title1
Length (hh:mm:ss): 00:02:30

Song 2: title2
Length (hh:mm:ss): 00:02:15

Song 3: title3
Length (hh:mm:ss): 00:02:15
=====

<album>
<general>
<title>My Album</title>
<year>2005</year>
</general>

<content>
<song>
<songTitle>title1</songTitle>
<songLengthInSeconds>150</songLengthInSeconds>
</song>
<song>
<songTitle>title2</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
<song>
<songTitle>title3</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
</content>
</album>

=====

I need some help in designing the XSLT file. I'd like the
<songLengthInSeconds> to be formatted in hh:mm:ss format. Also, I want to
display the elapsed time (in hh:mm:ss format) based on a total of
<songLengthInSeconds>. Could I perform this summation inside the XSLT?

Thank you very much!

Jul 20 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a


$ saxon time.xml time.xsl
Elapsed Time (hh:mm:ss): 00:07:00

Song 1: title1
Length (hh:mm:ss): 00:02:30

Song 2: title2
Length (hh:mm:ss): 00:02:15

Song 3: title3
Length (hh:mm:ss): 00:02:15


<album>
<general>
<title>My Album</title>
<year>2005</year>
</general>

<content>
<song>
<songTitle>title1</songTitle>
<songLengthInSeconds>150</songLengthInSeconds>
</song>
<song>
<songTitle>title2</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
<song>
<songTitle>title3</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
</content>
</album>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="text"/>

<xsl:template name="time">
<xsl:param name="s" select="songLengthInSeconds"/>
<xsl:text>(hh:mm:ss): </xsl:text>
<xsl:variable name="h" select="floor($s div 3600)"/>
<xsl:value-of select="format-number($h,'00')"/>
<xsl:text>:</xsl:text>
<xsl:variable name="m" select="floor(($s - $h * 60) div 60)"/>
<xsl:value-of select="format-number($m,'00')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="format-number($s - $h*3600 - $m*60,'00')"/>
</xsl:template>

<xsl:template match="song">
Song <xsl:number/>: <xsl:value-of select="songTitle"/>
Length <xsl:call-template name="time"/>
</xsl:template>
<xsl:template match="general">
<xsl:value-of select="Title"/>
Elapsed Time <xsl:text/>
<xsl:call-template name="time">
<xsl:with-param name="s" select="sum(../content/song/songLengthInSeconds)"/>
</xsl:call-template>
</xsl:template>

</xsl:stylesheet>

Jul 20 '05 #2

P: n/a
Please try this XSL..

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="text"/>

<xsl:template match="/album">
<xsl:apply-templates select="general" />
<xsl:apply-templates select="content/song" />
</xsl:template>

<xsl:template match="general">
<xsl:value-of select="title" /> (<xsl:value-of select="year"
/>)<xsl:text>&#xA;</xsl:text>
<xsl:variable name="elapsed-time">
<xsl:call-template name="format-time">
<xsl:with-param name="x"
select="sum(following-sibling::content[1]/song/songLengthInSeconds)"
/>
</xsl:call-template>
</xsl:variable>
Elapsed Time (hh:mm:ss): <xsl:value-of select="$elapsed-time"
/><xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template match="content/song">
Song 1: <xsl:value-of select="songTitle"
/><xsl:text>&#xA;</xsl:text>
<xsl:variable name="length">
<xsl:call-template name="format-time">
<xsl:with-param name="x" select="songLengthInSeconds" />
</xsl:call-template>
</xsl:variable>
Length (hh:mm:ss): <xsl:value-of select="$length"
/><xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template name="format-time">
<xsl:param name="x" />

<xsl:value-of select="format-number(floor(($x div 60) div 60),'00')"
/>:<xsl:value-of select="format-number(floor(($x div 60) mod
60),'00')" />:<xsl:value-of select="format-number($x mod 60,'00')" />
</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

"T-Narg" <tn***@untouchable.net> wrote in message news:<38*************@individual.net>...
I would like to produce the following output based on my XML file:

My Album (2005)
Elapsed Time (hh:mm:ss): 00:07:00

Song 1: title1
Length (hh:mm:ss): 00:02:30

Song 2: title2
Length (hh:mm:ss): 00:02:15

Song 3: title3
Length (hh:mm:ss): 00:02:15
=====

<album>
<general>
<title>My Album</title>
<year>2005</year>
</general>

<content>
<song>
<songTitle>title1</songTitle>
<songLengthInSeconds>150</songLengthInSeconds>
</song>
<song>
<songTitle>title2</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
<song>
<songTitle>title3</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
</content>
</album>

=====

I need some help in designing the XSLT file. I'd like the
<songLengthInSeconds> to be formatted in hh:mm:ss format. Also, I want to
display the elapsed time (in hh:mm:ss format) based on a total of
<songLengthInSeconds>. Could I perform this summation inside the XSLT?

Thank you very much!

Jul 20 '05 #3

P: n/a
Works well! Thank you very much.

"Mukul Gandhi" <mu**********@yahoo.com> wrote in message
news:b1**************************@posting.google.c om...
Please try this XSL..

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="text"/>

<xsl:template match="/album">
<xsl:apply-templates select="general" />
<xsl:apply-templates select="content/song" />
</xsl:template>

<xsl:template match="general">
<xsl:value-of select="title" /> (<xsl:value-of select="year"
/>)<xsl:text>&#xA;</xsl:text>
<xsl:variable name="elapsed-time">
<xsl:call-template name="format-time">
<xsl:with-param name="x"
select="sum(following-sibling::content[1]/song/songLengthInSeconds)"
/>
</xsl:call-template>
</xsl:variable>
Elapsed Time (hh:mm:ss): <xsl:value-of select="$elapsed-time"
/><xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template match="content/song">
Song 1: <xsl:value-of select="songTitle"
/><xsl:text>&#xA;</xsl:text>
<xsl:variable name="length">
<xsl:call-template name="format-time">
<xsl:with-param name="x" select="songLengthInSeconds" />
</xsl:call-template>
</xsl:variable>
Length (hh:mm:ss): <xsl:value-of select="$length"
/><xsl:text>&#xA;</xsl:text>
</xsl:template>

<xsl:template name="format-time">
<xsl:param name="x" />

<xsl:value-of select="format-number(floor(($x div 60) div 60),'00')"
/>:<xsl:value-of select="format-number(floor(($x div 60) mod
60),'00')" />:<xsl:value-of select="format-number($x mod 60,'00')" />
</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

"T-Narg" <tn***@untouchable.net> wrote in message

news:<38*************@individual.net>...
I would like to produce the following output based on my XML file:

My Album (2005)
Elapsed Time (hh:mm:ss): 00:07:00

Song 1: title1
Length (hh:mm:ss): 00:02:30

Song 2: title2
Length (hh:mm:ss): 00:02:15

Song 3: title3
Length (hh:mm:ss): 00:02:15
=====

<album>
<general>
<title>My Album</title>
<year>2005</year>
</general>

<content>
<song>
<songTitle>title1</songTitle>
<songLengthInSeconds>150</songLengthInSeconds>
</song>
<song>
<songTitle>title2</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
<song>
<songTitle>title3</songTitle>
<songLengthInSeconds>135</songLengthInSeconds>
</song>
</content>
</album>

=====

I need some help in designing the XSLT file. I'd like the
<songLengthInSeconds> to be formatted in hh:mm:ss format. Also, I want to display the elapsed time (in hh:mm:ss format) based on a total of
<songLengthInSeconds>. Could I perform this summation inside the XSLT?

Thank you very much!

Jul 20 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.