XML工房

 
〔作品2〕Apple iTunes音楽リストのHTML化
~第3章~ iTunes音楽リストのHTML化(2)

2006年4月号掲載記事

今回は、iTunesの画面左側にある「最近追加した曲」の情報をHTML化するためのXSLTスタイルシートを作成していきます。

iTunes画面イメージ

「iTunes Music Library.xml」の「最近追加した曲」(/plist/dict/array/dict)の構造は以下のようになっています。「最近追加した曲」の情報はTrack IDのみを持っており、ジャンル、曲名、アーティスト名、コメントを取得するには、<key>Tracks</key>の子要素(/plist/dict/dict/dict)を参照しなければなりません。

iTunes Music Library.xml
  ・

<plist version="1.0">
<dict>
   ・
   ・
   <key>Tracks</key>
   <dict>
    <key>55</key>
    <dict>
    <key>Track ID</key><integer>55</integer>
    <key>Name</key><string>World Lullabye</string>
    <key>Artist</key><string>Jane Child</string>
    ・
    <key>Genre</key><string>Pop</string>
    ・
    ・
    <key>Comments</key><string>学生時代のお気に入りの曲9</string>
    ・
    ・
    </dict>
    <key>56</key>
    <dict>
    <key>Track ID</key><integer>56</integer>
    <key>Name</key><string>Question</string>
    <key>Artist</key><string>Jane Child</string>
    ・
    <key>Genre</key><string>Pop</string>
    ・
    ・
    <key>Comments</key><string>学生時代のお気に入りの曲10</string>
    ・
    ・
    </dict>
    ・
    ・
   </dict>
   <key>Playlists</key>
   <array>
   ・
   ・
    <dict>
    <key>Name</key><string>最近追加した曲</string>
    ・
    ・
    <key>Playlist Items</key>
    <array>
      <dict>
       <key>Track ID</key><integer>55</integer>
      </dict>
      <dict>
       <key>Track ID</key><integer>56</integer>
      </dict>
      <dict>
       <key>Track ID</key><integer>57</integer>
      </dict>
      <dict>
       <key>Track ID</key><integer>58</integer>
      </dict>
      <dict>
       <key>Track ID</key><integer>59</integer>
      </dict>
    </array>
    </dict>
   </array>
</dict>
</plist>
※上記のデータは、一部省略しております。

そこで、今回作成するXSLTスタイルシートの処理手順を考えてみると、

  1. 「最近追加した曲」のTrack IDを取得する。
  2. 取得した「最近追加した曲」のTrack IDと<key>Tracks</key>の子要素(/plist/dict/dict/dict)のTrack IDの値が同じもののジャンル、曲名、アーティスト名、コメントを出力する。

が一般的なものとなります。この処理手順を盛り込んだXSLTスタイルシートを紹介します。

XSLTスタイルシート

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

 <xsl:output method="html" indent="yes" encoding="Shift_JIS"
  doctype-public="-//W3C//DTD HTML 4.01//EN"
   doctype-system="http://www.w3.org/TR/html4/strict.dtd" />

 <!-- 最近追加した曲のTrack IDを取得 -->
<xsl:variable name="track_id" select="/plist/dict/array/dict[string[1]='最近追加した曲']/array/dict/integer" />

 <xsl:template match="/">
<html>
  <!-- タイトルの設定 -->
   <head>
    <title>最近追加した曲の一覧</title>
   </head>

  <body>
    <table border="1">
     <!-- 列名の設定 -->
     <tr>
    <th>ジャンル</th>
    <th>曲名</th>
    <th>アーティスト</th>
    <th>コメント</th>
     </tr>

    <!-- 最近追加した曲の情報を取得 -->
     <xsl:for-each select="plist/dict/dict/dict[integer[1]=$track_id]">
    <tr>
     <!-- ジャンルの取得 -->
     <xsl:apply-templates select="key[text()='Genre']" />
     <!-- 曲名の取得 -->
     <xsl:apply-templates select="key[text()='Name']" />
     <!-- アーティストの取得 -->
     <xsl:apply-templates select="key[text()='Artist']" />
     <!-- コメントの取得 -->
     <xsl:if test="key[text()='Comments']">
      <xsl:apply-templates select="key[text()='Comments']" />
     </xsl:if>
     <xsl:if test="not(key[text()='Comments'])">
      <td>コメントなし</td>
     </xsl:if>
     <!-- 改行 -->
     <xsl:text>&#xA;</xsl:text>
    </tr>
     </xsl:for-each>

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

 <!-- key要素のためのテンプレート -->
<xsl:template match="key">
   <!-- コンテキストノードの兄弟ノードを取得 -->
   <td><xsl:value-of select="following-sibling::node()[1]" /></td>
  </xsl:template>

</xsl:stylesheet>

このXSLTスタイルシートでは、まず、variable要素を用いて、「最近追加した曲」のTrack IDを取得します。このとき、variable要素のselect属性に、"/plist/dict/array/dict[string[1]='最近追加した曲']/array/dict/integer "と記述することで、該当するノードの値をすべて取得できます。この例では、「55」、「56」、「57」、「58」、「59」がtrack_id変数に格納されます。そして、「最近追加した曲」の情報を取得する際のfor-each要素のselect属性に" plist/dict/dict/dict[integer[1]=$track_id]"と記述しています。曲の情報の中にあるTrack IDの値とtrack_id変数を比較し、同じ場合のみジャンル、曲名、アーティスト名、コメントを出力します。これは「1対n」の比較で、1つでも同じ値があれば真となり、後続の処理を実行します。

実際にXSLT変換ツールでXSLT変換を行なって、確認してみましょう。

今回作成したXSLTスタイルシートは、前回作成したものに少し手を加えただけです。このXSLTスタイルシートを流用して、皆さんがオリジナルで作ったプレイリストをHTML変換することもできると思います。ぜひ、活用してみてください。

「XML工房」のIndexへ戻る

ページトップへ▲

HOMEへ戻る