An XML question - calculating time total

Discussion in 'XML' started by T-Narg, Mar 1, 2005.

  1. T-Narg

    T-Narg Guest

    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!
    T-Narg, Mar 1, 2005
    #1
    1. Advertising

  2. $ 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:eek:utput 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>
    David Carlisle, Mar 1, 2005
    #2
    1. Advertising

  3. T-Narg

    Mukul Gandhi Guest

    Please try this XSL..

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

    <xsl:eek:utput 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>
    </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>
    </xsl:text>
    </xsl:template>

    <xsl:template match="content/song">
    Song 1: <xsl:value-of select="songTitle"
    /><xsl:text>
    </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>
    </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" <> wrote in message news:<>...
    > 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!
    Mukul Gandhi, Mar 1, 2005
    #3
  4. T-Narg

    T-Narg Guest

    Works well! Thank you very much.

    "Mukul Gandhi" <> wrote in message
    news:...
    > Please try this XSL..
    >
    > <?xml version="1.0"?>
    > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    > version="1.0">
    >
    > <xsl:eek:utput 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>
    </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>
    </xsl:text>
    > </xsl:template>
    >
    > <xsl:template match="content/song">
    > Song 1: <xsl:value-of select="songTitle"
    > /><xsl:text>
    </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>
    </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" <> wrote in message

    news:<>...
    > > 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!
    T-Narg, Mar 3, 2005
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. eric
    Replies:
    5
    Views:
    730
    Joris Gillis
    Nov 16, 2004
  2. flamesrock
    Replies:
    8
    Views:
    430
    Hendrik van Rooyen
    Nov 24, 2006
  3. Tim
    Replies:
    3
    Views:
    130
  4. Jayesh Kamdar
    Replies:
    2
    Views:
    140
    Gunnar Hjalmarsson
    May 25, 2005
  5. Washington Ratso
    Replies:
    1
    Views:
    39
    Chris “Kwpolska†Warrick
    Apr 3, 2014
Loading...

Share This Page