Scripteanna Cineál Movable


script XSLT a ghiniúint liostú albam ó iTunes XML

Nuair a fuair mé mé féin ar iPod , fuair mé na liostaí clóite ar fáil ón iTunes Ní raibh clár go háirithe go hiontach (in ainneoin an comhéadan idirghníomhach á superb), agus ní raibh mé in ann a fháil ar liosta achoimre ghearr ar albam. Ós rud é go siopaí iTunes a leabharlann mar XML, a úsáidtear mé XSLT a chruthú níos liostú mo liking. Ós rud é go claonadh agam a bheith ag éisteacht le albam seachas singles, bhí mé liosta albaim i ngrúpaí de réir seánra .

Chun seo a úsáid script, ach amháin an albumList.xml agus albumList.xsl thaispeántar thíos le do Mo Ceol / iTunes fillteán, agus albumList.xml oscailte in Internet Explorer 6+ nó Mozilla Firefox (Ní bheidh IE5 oibre; nach bhfuil mé tástáil ar bith brabhsálaithe eile).

An XML iTunes 'liosta maoine'

Tá an leabharlann iTunes stóráil mar XML i gcomhad ar a dtugtar iTunes Music Library.xml . Úsáideann sé teanga XML cineálach dtugtar liosta maoine , nó plist , atá i seilbh faisnéis péirí tábhachtacha / luach. In áit a bheith in oiriúint do amhráin cur síos, is féidir é a úsáid chun cur síos ar airíonna aon ní níos mó nó níos lú. Seo é an chaoi Breathnaíonn an XML:

<plist version="1.0">
  <dict>
    <key>Tracks</key>
    <dict>
      <key>638</key>
      <dict>
        <key>Track ID</key><integer>638</integer>
        <key>Name</key><string>Take Me To The River</string>
        <key>Artist</key><string>Talking Heads</string>
        <key>Composer</key><string>Al Green &#38; M. Hodges</string>
        <key>Album</key><string>Stop Making Sense</string>
        <key>Genre</key><string>Alternative &#38; Punk</string>
        ... etc ...
      </dict>
    </dict>
  </dict>
</plist>

Ciallaíonn sé seo go bhfuil a fháil, a rá, an t-ainm albam, ní mór dúinn a mheaitseáil a <teaghrán> le siblín deiridh sin roimhe seo <eochair> de 'Album':

string [roimhe-siblín :: eochair [1] = 'Albam']

Is é sin, an <teaghrán> eilimint i gcás ina bhfuil an 1ú <eochair> eilimint san ais roimhe-deartháireacha agus deirfiúracha an luach 'Albam'.

Cé go bhfuil an ilchuspóireach teanga XML áisiúil, tá sé cinnte níos casta a ionramháil seachas teanga XML oiriúint chun ionadaíocht liosta rianta, mar sin a chur ar anáil domhain le haghaidh cad a leanas!

Dul liosta albam

Is é an XML iTunes le liosta de na hamhráin. Is é an t-albam is cosúil an t-amhrán ar aon rud níos mó, i ndáiríre, ná tréith an t-amhrán, mar sin beidh cur chuige simplí a thabhairt ar an t-ainm albam uair amháin do gach amhrán a bhfuil an chuma air. Mar sin, a fháil ar liosta ceart albam, a úsáid mé cleasanna áit cliste fáil leis an <XSL: eochair> eilimint agus an eochair () agus a ghiniúint-id () feidhmeanna.

Daoine eile a mhínigh an úsáid a bhaint as <XSL: eochair> níos fearr as féidir liom, ach i gairid, anseo, an <XSL: eochair> Tógann eilimint liosta de <dict> nóid ionadaíonn amhráin. An <XSL: do-gach> eilimint sin Roghnaíonn <dict> (ie amhrán) gnéithe ina oireann an id ghintear go huathoibríoch ar an id ghintear go huathoibríoch ar an chéad nód ar ais ag an eochair () fheidhm. Níl, a dhéanann sé mo casadh ceann, freisin. An stílbhileog mar thoradh air a fháil ar liosta de albam (leis na healaíontóirí a bhaineann) Tá:

<xsl:key name="songsByAlbum" match="dict"
  use="string[preceding-sibling::key[1]='Album']"/>

<xsl:template match="/plist/dict/dict">
  <html>
    <body>
      <table>

        <xsl:for-each select="dict[generate-id(.)=
            generate-id(key('songsByAlbum',string)[1])]">
          <xsl:sort select="string[preceding-sibling::key[1]='Album']"/>
          <tr>
            <td><xsl:value-of select="string[preceding-sibling::key[1]='Album']"/></td>
            <td><xsl:value-of select="string[preceding-sibling::key[1]='Artist']"/></td>
          </tr>
        </xsl:for-each>

      </table>
    </body>
  </html>
</xsl:template>

Tá sé seo fadhbanna le dtiomsúchán eile, cé. Beidh sé piocadh suas whoever an t-ealaíontóir don chéad amhrán de thiomsú, a bhreathnaíonn beagán aisteach. Chun seo a shocrú, a úsáid mé an 'Cuid de Tiomsú' bratach mar seo a leanas:

<xsl:key name="songsByAlbum" match="dict"
  use="string[preceding-sibling::key[1]='Album']"/>

<xsl:template match="/plist/dict/dict">
  <html>
    <body>
      <table>

        <xsl:for-each select="dict[generate-id(.)=generate-id(key('albums',string)[1])]">
          <xsl:sort select="string[preceding-sibling::key[1]='Album']"/>
          <tr>
            <td><xsl:call-template name="albumName"/></td>
            <td><xsl:call-template name="artistName"/></td>
          </tr>
        </xsl:for-each>

      </table>
    </body>
  </html>
</xsl:template>

<xsl:template name="albumName">
  <xsl:value-of select="string[preceding-sibling::key[1]='Album']"/>
</xsl:template>

<xsl:template name="artistName">
  <xsl:choose>
    <xsl:when test="true[preceding-sibling::key[1]='Compilation']">
      <i>Compilation</i>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="string[preceding-sibling::key[1]='Artist']"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Mé arna miondealú an teimpléad príomhbhunaíochta a dhul isteach teimpléid ar leith le haghaidh albam agus ealaíontóir - Is féidir XSLT bheith deacair a leanúint ag an chuid is fearr na n-amanna, mar sin is maith liom a modularise na teimpléid oiread agus is féidir liom.

Tá liosta de albam grúpáilte de réir seánra

Is é an deacracht leis an liosta an tslí a gcuirtear an ceol ar fad brúite suas le chéile. Ní raibh mé i ndáiríre mar a bhfuil an Páise Naomh Matthew shoulders le chuimil Stop Making Sense .

A ghrúpáil na albam ag seánra, a úsáid mé mar theicníc cheap Steve Muench, Oracle 'XML Evangelist Teicniúil', fuair teideal 'grúpáil Muenchian'.

Arís, tá daoine eile a mhínigh seo níos fearr ná mar a raibh mé, mar sin is leor a rá (más mian leat chun iarracht a leanúint le hoibriú an XSL) go n-úsáideann sé an ghiniúint-id () Feidhm ar na heochracha XSL sainithe ar amhráin ag Seánra agus albam, agus ag an bpointe mar teimpléad albumsInGenre dtugtar, is é an comhthéacs atá ann faoi láthair ar an gcéad <dict> amhrán laistigh de gach seánra.

Laistigh den albumsInGenre teimpléad, tá an teicníc céanna a úsáidtear a fháil ar an chéad amhrán i ngach Albam, d'fhonn a fháil ar an t-ainm albam agus ealaíontóir. Úsáidim freisin preideacáid bhreise a scagadh a thuilleadh an nód-leagtar ar an seánra a rith mar pharaiméadar leis an teimpléad.

(Beidh saol a bheith níos éasca le XSLT 2.0 a mbeidh do-gach-grúpa eilimint).

Breathnaíonn an stílbhileog mar seo:

<xsl:key name="songsByAlbum" match="dict"
  use="string[preceding-sibling::key[1]='Album']"/>
<xsl:key name="songsByGenre" match="dict"
  use="string[preceding-sibling::key[1]='Genre']"/>

<xsl:template match="/plist/dict/dict">
  <html>
    <body>
      <table>

        <xsl:for-each select="dict[generate-id(.)=
            generate-id(key('songsByGenre',string)[1])]">
          <xsl:sort select="string[preceding-sibling::key[1]='Genre']"/>
          <xsl:for-each select="key('songsByGenre',string)[1]">
            <xsl:call-template name="albumsInGenre">
              <xsl:with-param name="genre"
                  select="string[preceding-sibling::key[1]='Genre']"/>
            </xsl:call-template>
          </xsl:for-each>
        </xsl:for-each>

      </table>
    </body>
  </html>
</xsl:template>

<xsl:template name="albumsInGenre">
  <xsl:param name="genre"/>

  <tr><td colspan='3'><b><xsl:value-of select="$genre"/></b></td></tr>

  <xsl:variable name="song" select="/plist/dict/dict/dict"/>
  <xsl:for-each select="$song[generate-id(.)=
      generate-id(key('songsByAlbum',string[preceding-sibling::key[1]='Album'])[1])]">
    <xsl:sort select="string[preceding-sibling::key[1]='Album']"/>
    <xsl:for-each select="key('songsByAlbum',string[preceding-sibling::key[1]='Album'])
        [string[preceding-sibling::key[1]='Genre']=$genre][1]">
      <tr>
        <td> </td>
        <td><xsl:call-template name="albumName"/></td>
        <td><xsl:call-template name="artistName"/></td>
      </tr>
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

Agus tá an liosta albam mar thoradh air rud éigin cosúil le:

Electronica / Damhsa
  boulevard St. Germain
  Dehli9 Tosca
  ar Thalamh Brian Eno
snagcheol
  Madar Jan Garbarek
  Na Fives Hot & Sevens  Louis Armstrong & The Cúig Hot

Más mian leat ach an albam ar an iPod, seachas na albam sa leabharlann iTunes, ansin tá coinníoll breise a chur leis an istigh-an chuid is mó do-gach, ionas go mbeidh sé:

<xsl:for-each select="key('songsByAlbum',string[preceding-sibling::key[1]='Album'])
        [string[preceding-sibling::key[1]='Genre']=$genre]
        [not(true[preceding-sibling::key[1]='Disabled'])][1]">

Nuair a chuirfear amanna rian

Tar fuair seo i bhfad, bhí mé a fheiceáil ar an ré gach albam. Tá ré gach amhrán a stóráiltear (i milleasoicindí) in aghaidh Am Iomlán eochair, mar sin tá an teimpléad seo a dhéanamh:

<xsl:template name="iTunesTimeAlbum">
  <xsl:variable name="tracksInAlbum"
      select="key('songsByAlbum',string[preceding-sibling::key[1]='Album'])"/>
  <xsl:variable name="t"
      select="sum($tracksInAlbum/integer[preceding-sibling::key[1]='Total Time'])"/>
  <xsl:call-template name="formatTime">
    <xsl:with-param name="t" select="$t"/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="formatTime">
  <xsl:param name="t"/>
  <xsl:if test="$t != 0">
    <xsl:variable name="h" select="floor(($t div (1000*60*60)))"/>
    <xsl:variable name="m" select="floor(($t div (1000*60)) mod 60)"/>
    <xsl:variable name="s" select="floor(($t div 1000) mod 60)"/>
    <xsl:if test="$h != 0"><xsl:value-of select="$h"/>h</xsl:if>
    <xsl:value-of select="format-number($m,'00')"/>m
    <xsl:value-of select="format-number($s,'00')"/>s
  </xsl:if>
</xsl:template>

Arís, más mian leat a fheiceáil ar an ré ar an iPod ionad sa leabharlann iTunes (nuair ach cuid de na rianta ar an albam roghnaithe le haistriú chuig an iPod), tá coinníoll breise a chur leis le haghaidh an roghnú le haghaidh athróg t:

<xsl:variable name="t"
      select="sum($tracksInAlbum/integer[preceding-sibling::key[1]='Total Time']
      [not(../true[preceding-sibling::key[1]='Disabled'])])"/>

Beidh teimpléad den chineál céanna a thabhairt ar an t-am iomlán an cheoil sa leabharlann iTunes (nó ar an iPod):

<xsl:template name="iTunesTimeTotal">
  <xsl:variable name="t"
      select="sum(dict/integer[preceding-sibling::key[1]='Total Time'])"/>
  <xsl:call-template name="formatTime">
    <xsl:with-param name="t" select="$t"/>
  </xsl:call-template>
</xsl:template>

Agus má bhí tú a bheith ar an méid diosca iomlán na hamhráin, tá sé ar fáil i gcoinne an méid eochair:

<xsl:template name="iTunesSizeTotal">
  <xsl:variable name="s" select="sum(dict/integer[preceding-sibling::key[1]='Size'])"/>
  <xsl:value-of select="floor($s div (1000*1000)) div 1000"/>GB
</xsl:template>

Oscailt an liostú go díreach i mbrabhsálaí

In áit a bheith ag baint úsáide as uirlisí XML / XSLT speisialta, oscail mé an liostú go díreach i bhrabhsálaí. Chun seo a dhéanamh, a chruthú mé comhad XML 'fillteán' a shonraíonn a bhfuil stílbhileog a chur i bhfeidhm leis an méid comhad XML, ag baint úsáide as an an <xml-stílbhileog?> Treoir phróiseála agus <lena n-áirítear> eilimint:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="albumList.xsl" type="text/xsl"?>
<wrapper>
  <incl file="iTunes Music Library.xml"/>
</wrapper>

Chuir mé ansin teimpléad ag barr an stílbhileog XSL a oireann an <fillteán> eilimint chuir mé thart ar an gcomhad XML iniata, agus baineann an teimpléid stílbhileog chun an comhad XML iniata.

<xsl:template match="/wrapper">
    <xsl:apply-templates select="document(incl/@file)"/>
  </xsl:template>

chóir sé seo a bheith ag obair in aon bhrabhsálaí faoi láthair; Mé sheiceáil sé ar Internet Explorer (6.0+) agus Firefox.

Tabhair faoi deara: Ba chuige malartach a réamh-phróiseas an p-liosta XML i struchtúr níos traidisiúnta, mar a mhínítear sa www.xmldatabases.org/WK/blog/1086?t=item , bheadh ansin níos simplí a ionramháil le XSLT . Tá mé sásta a chónaí leis an roimhe-deartháir nó deirfiúr a thógáil chun a bheith in ann a ghiniúint ar an liosta in aon chéim amháin.


Seo go léir a chur le chéile sa stílbhileog thíos. Déanann sé ar feadh amhlaidh a stílbhileog mór, ach leis an eolas thuas, ba cheart go mbeifeá in ann a phiocadh ó chéile agus a úsáid ar na codanna is mian leat.

... Mar sin anois tá mé liosta mearthagartha de na halbaim ar mo iPod.


Chun seo a úsáid script, i bhfoirm a bunaidh nó go hiomlán, ach amháin an albumList.xml agus albumList.xsl thaispeántar thíos le do Mo Ceol / iTunes fillteán, agus albumList.xml oscailte i do bhrabhsálaí (IE6 nó Firefox). Más mian leat a chur in oiriúint ar an leagan amach, leis na treoirlínte thuas ba cheart go mbeifeá in ann a mheascadh agus a mheaitseáil leis na comhpháirteanna mar is gá. Tá fáilte romhat a ath-úsáid na scripteanna [gan aon bharántas sainráite nó intuigthe] le haghaidh úsáide pearsanta. Má tá aon cheist agat nó teacht ar aon fadhbanna, téigh i dteagmháil liom .

Comhad albumList.xml (sonraítear a chur i bhfeidhm albumList.xsl le iTunes Ceol Library.xml ):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="albumList.xsl" type="text/xsl"?>
<wrapper>
  <incl file="iTunes Music Library.xml"/>
</wrapper>

Comhad albumList.xsl bunúsach leagan (liostaí ainm agus ealaíontóir albam ar iPod):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- (c) Chris Veness 2005 -->
  <xsl:output method="html" encoding="UTF-8" indent="yes"/>

  <!-- match the wrapper and apply templates to the <incl> xml file -->
  <xsl:template match="/wrapper">
    <xsl:apply-templates select="document(incl/@file)/plist/dict/dict"/>
  </xsl:template>

  <xsl:key name="songsByGenre" match="dict" use="string[preceding-sibling::key[1]='Genre']"/>
  <xsl:key name="songsByAlbum" match="dict" use="string[preceding-sibling::key[1]='Album']"/>

  <xsl:template match="dict">
    <html>
      <head>
        <title>iPod Album Listing</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
      </head>
      <body>
        <table>

          <xsl:for-each select="dict[generate-id(.)=generate-id(key('songsByGenre',string)[1])]">
            <xsl:sort select="string[preceding-sibling::key[1]='Genre']"/>
            <xsl:for-each select="key('songsByGenre',string)[1]">
              <xsl:call-template name="albumsInGenre">
                <xsl:with-param name="genre" select="string[preceding-sibling::key[1]='Genre']"/>
              </xsl:call-template>
            </xsl:for-each>
          </xsl:for-each>

        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template name="albumsInGenre">
    <xsl:param name="genre"/>

    <!-- genre header -->
    <tr><td colspan='3'><b><xsl:value-of select="$genre"/></b></td></tr>

    <!-- output each album in genre -->
    <xsl:variable name="song" select="/plist/dict/dict/dict"/>
    <xsl:for-each select="$song[generate-id(.)=
        generate-id(key('songsByAlbum',string[preceding-sibling::key[1]='Album'])[1])]">
      <xsl:sort select="string[preceding-sibling::key[1]='Album']"/>
      <xsl:for-each select="key('songsByAlbum',string[preceding-sibling::key[1]='Album'])
          [string[preceding-sibling::key[1]='Genre']=$genre]
          [not(true[preceding-sibling::key[1]='Disabled'])][1]">
        <tr valign='top'>
          <td width='20'> </td>
          <!-- the album name: -->
          <td><xsl:value-of select="string[preceding-sibling::key[1]='Album']"/></td>
          <!-- the artist: -->
          <td>
            <xsl:choose>
              <xsl:when test="true[preceding-sibling::key[1]='Compilation']">
                <i>Compilation</i>
              </xsl:when>
              <xsl:otherwise>
                <xsl:value-of select="string[preceding-sibling::key[1]='Artist']"/>
              </xsl:otherwise>
            </xsl:choose>
          </td>
        </tr>
      </xsl:for-each>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

Comhad albumList.xsl leagan iomlán (áirítear leabharlann iTunes iomlán le hamanna agus hiomláin):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <!-- (c) Chris Veness 2005-2006 -->
  <xsl:output method="html" encoding="UTF-8" indent="yes"/>

  <!-- match the wrapper and apply templates to the <incl> xml file -->
  <xsl:template match="/wrapper">
    <xsl:apply-templates select="document(incl/@file)/plist/dict/dict"/>
  </xsl:template>

  <xsl:key name="songsByGenre" match="dict" use="string[preceding-sibling::key[1]='Genre']"/>
  <xsl:key name="songsByAlbum" match="dict" use="string[preceding-sibling::key[1]='Album']"/>

  <xsl:template match="dict">
    <html>
      <head>
        <title>iTunes Album Listing</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <style type='text/css'> td { vertical-align: top; padding-right: 1em; } </style>
      </head>
      <body>
        <table>

          <xsl:for-each select="dict[generate-id(.)=generate-id(key('songsByGenre',string)[1])]">
            <xsl:sort select="string[preceding-sibling::key[1]='Genre']"/>
            <xsl:for-each select="key('songsByGenre',string)[1]">
              <xsl:call-template name="albumsInGenre">
                <xsl:with-param name="genre" select="string[preceding-sibling::key[1]='Genre']"/>
              </xsl:call-template>
            </xsl:for-each>
          </xsl:for-each>

          <!-- totals -->
          <tr>
            <td colspan='4' style='color: gray'><b>Total</b></td>
            <td style='color: gray' align='right'><xsl:call-template name="iPodTimeTotal"/></td>
            <td style='color: gray' align='right'><xsl:call-template name="iTunesTimeTotal"/></td>
          </tr>
          <tr>
            <td colspan='4'> </td>
            <td style='color: gray' align='right'><xsl:call-template name="iPodSizeTotal"/></td>
            <td style='color: gray' align='right'><xsl:call-template name="iTunesSizeTotal"/></td>
          </tr>

        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template name="albumsInGenre">
    <xsl:param name="genre"/>

    <tr>  <!-- genre header -->
      <td colspan='4'><b><xsl:value-of select="$genre"/></b></td>
      <td align='right' style='color: gray'><i>iPod</i></td>
      <td align='right' style='color: gray'><i>iTunes</i></td>
    </tr>

    <xsl:variable name="song" select="/plist/dict/dict/dict"/>
    <xsl:for-each select="$song[generate-id(.)=
        generate-id(key('songsByAlbum',string[preceding-sibling::key[1]='Album'])[1])]">
      <xsl:sort select="string[preceding-sibling::key[1]='Album']"/>
      <xsl:for-each select="key('songsByAlbum',string[preceding-sibling::key[1]='Album'])
          [string[preceding-sibling::key[1]='Genre']=$genre]
          [1]">
          <!--  for albums on iPod only, add
                [not(true[preceding-sibling::key[1]='Disabled'])] -->
        <tr>
          <td> </td>
          <td><xsl:call-template name="album"/></td>
          <td><xsl:call-template name="artist"/></td>
          <td align='right'><xsl:call-template name="iPodTimeAlbum"/></td>
          <td align='right'><xsl:call-template name="iTunesTimeAlbum"/></td>
        </tr>
      </xsl:for-each>
    </xsl:for-each>
    <tr><td colspan='6'>&#160;</td></tr>  <!-- space between genres -->
  </xsl:template>

  <xsl:template name="album">
    <xsl:value-of select="string[preceding-sibling::key[1]='Album']"/>
  </xsl:template>

  <xsl:template name="artist">
    <xsl:choose>
      <xsl:when test="true[preceding-sibling::key[1]='Compilation']">
        <i>Compilation</i>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="string[preceding-sibling::key[1]='Artist']"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="iPodTimeAlbum">
    <xsl:variable name="tracksInAlbum"
        select="key('songsByAlbum',string[preceding-sibling::key[1]='Album'])"/>
    <xsl:variable name="t"
        select="sum($tracksInAlbum/integer[preceding-sibling::key[1]='Total Time']
            [not(../true[preceding-sibling::key[1]='Disabled'])])"/>
    <xsl:call-template name="formatTime">
      <xsl:with-param name="t" select="$t"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="iTunesTimeAlbum">
    <xsl:variable name="tracksInAlbum"
        select="key('songsByAlbum',string[preceding-sibling::key[1]='Album'])"/>
    <xsl:variable name="t"
        select="sum($tracksInAlbum/integer[preceding-sibling::key[1]='Total Time'])"/>
    <xsl:call-template name="formatTime">
      <xsl:with-param name="t" select="$t"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="iPodTimeTotal">
    <xsl:variable name="t" select="sum(dict/integer[preceding-sibling::key[1]='Total Time']
        [not(../true[preceding-sibling::key[1]='Disabled'])])"/>
    <xsl:call-template name="formatTime">
      <xsl:with-param name="t" select="$t"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="iTunesTimeTotal">
    <xsl:variable name="t" select="sum(dict/integer[preceding-sibling::key[1]='Total Time'])"/>
    <xsl:call-template name="formatTime">
      <xsl:with-param name="t" select="$t"/>
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="iPodSizeTotal">
    <xsl:variable name="s" select="sum(dict/integer[preceding-sibling::key[1]='Size']
        [not(../true[preceding-sibling::key[1]='Disabled'])])"/>
    <xsl:value-of select="floor($s div (1000000)) div 1000"/>GB
  </xsl:template>

  <xsl:template name="iTunesSizeTotal">
    <xsl:variable name="s" select="sum(dict/integer[preceding-sibling::key[1]='Size'])"/>
    <xsl:value-of select="floor($s div (1000000)) div 1000"/>GB
  </xsl:template>

  <xsl:template name="formatTime">
    <xsl:param name="t"/>
    <xsl:if test="$t != 0">
      <xsl:variable name="h" select="floor(($t div (1000*60*60)))"/>
      <xsl:variable name="m" select="floor(($t div (1000*60)) mod 60)"/>
      <xsl:variable name="s" select="floor(($t div 1000) mod 60)"/>
      <xsl:if test="$h != 0"><xsl:value-of select="$h"/>:</xsl:if>
      <xsl:value-of select="format-number($m,'00')"/>:<xsl:value-of select="format-number($s,'00')"/>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>