XML工房

〔作品2〕Apple iTunes音楽リストのHTML化

~第2章~ iTunes音楽リストのHTML化(1)

2006年3月号掲載記事

こんにちは。インフォテリアの野中です。

前回の最後に紹介した出力イメージには、ジャンル、曲名、アーティスト、コメントがありました。これらの情報は、<key>Tracks</key>の直下にあるdict要素の子要素であるdict要素の中に含まれています。(ルート要素(plist要素)から数えると3回目に出現するdict要素になります。)

iTunes Music Library.xml
  ・
   ・
<plist version="1.0">
<dict>
  ・
  ・
  <key>Tracks</key>
  <dict>
   <key>37</key>
   <dict>
    <key>Track ID</key><integer>37</integer>
    <key>Name</key><string>Holst: The Planets, Op. 32, H 125 - 1. Mars, The Bringer Of War</string>
    <key>Artist</key><string>Sir Georg Solti; London Philharmonic Orchestra</string>

    <key>Composer</key><string>Holst, Gustav (1874-1934)</string>
    <key>Album</key><string>Holst: The Planets; Elgar: Pomp &#38; Circumstance</string>
    <key>Genre</key><string>Classical</string>
    ・
    ・
    <key>Comments</key><string>お気に入りのクラッシック1</string>
    ・
    ・
   </dict>
   <key>38</key>
   <dict>
    <key>Track ID</key><integer>38</integer>
    <key>Name</key><string>Holst: The Planets, Op. 32, H 125 - 2. Venus, The Bringer Of Peace</string>
    <key>Artist</key><string>Sir Georg Solti; London Philharmonic Orchestra</string>

    <key>Composer</key><string>Holst, Gustav (1874-1934)</string>
    <key>Album</key><string>Holst: The Planets; Elgar: Pomp &#38; Circumstance</string>
    <key>Genre</key><string>Classical</string>
    ・
    ・
    <key>Comments</key><string>お気に入りのクラッシック2</string>
    ・
    ・
   </dict>
   ・
   ・
  </dict>
  ・
  ・
</dict>
</plist>
※上記のデータは、一部省略しております。

コメント(<key>Comments</key><string>お気に入りのクラッシック1</string>)については、iTunesに取り込んだだけでは設定されません。曲のプロパティとして、個別に設定する必要があります。コメントが設定されていない場合は、コメントデータ(<key>Comments</key><string>~~~</string>)が「iTunes Music Library.xml」中には存在しません。それ以外のジャンル(Genre)、曲名(Name)、アーティスト(Artist)は、iTunesに取り込むことで自動的に設定されます。

「iTunes Music Library.xml」よりジャンル、曲名、アーティスト、コメントを出力する基本的なXSLTスタイルシートを紹介します。

iTunes Music Library.xml

<?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" />

 <xsl:template match="/">
   <html>
  <!-- タイトルの設定 -->
   <head>
    <title>My iTunes Music Library!!</title>
    </head>

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

     <!-- 音楽データの情報取得 -->
      <xsl:for-each select="plist/dict/dict/dict">
       <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スタイルシートでは、key要素の内容が「Genre(ジャンル)」の場合、「Name(曲名)」の場合、「Artist(アーティスト)」の場合、「Comments(コメント)」の場合に、各々key要素のためのテンプレートを呼び出します。ただし、前述のとおり、Comments(コメント)が設定されていない場合は、データとして存在しませんので、if要素において存在する場合と存在しない場合とで分岐しています。

そして、key要素のためのテンプレートでは、key要素の次の兄弟ノードの値を取得します。ここで、value-of要素のselect属性には、"following-sibling::node()[1]"と記述していますが、"following-sibling::node()"と記述しても実は同じ結果を返します。"following-sibling::node()[1]"と記述した場合は、key要素の次に出てくる1番目のノードのみを選択し、"following-sibling::node()"と記述した場合は、key要素の次に出てくるすべてのノードを選択しますが、XSLTのvalue-of要素の処理は、複数ノードのうちの最初のノードの値のみを取得するからです。

それでは、お手持ちのXSLT変換ツールでXSLT変換を行なってみましょう。(注1)
出力イメージどおりに変換されましたか?

次回は、このXSLTスタイルシートを元に、iTunesのプレイリストにある「最近追加した曲」の一覧を出力するためのXSLTスタイルシートを作成したいと思います。

出力イメージ

(注1)
XSLT変換ツールをお持ちでない方は、JavaでXSLT変換を行うことができます。次のようなプログラムを実行します。このXSLTExecクラスは、実行時の第1引数であるXMLファイルを、第2引数であるXSLTスタイルシートで変換し、そして第3引数であるファイルに変換結果を出力します。プログラムの動作確認はJ2SE 5で行っています。

>Java XSLTExec output.xml sample.xsl output.txt

import java.io.FileOutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class XSLTExec {

 /**
   * エントリポイント.
   * @param args コマンドライン引数
   */
   public static void main(String[] args) {
   if (args.length < 3) {
    System.out.println(
    "usage: XSLTExec XML-file XSLT-stylesheet Output-file");
    return;
   }
   String xml = args[0];
   String xslt = args[1];
   String output = args[2];

  try {
    TransformerFactory tf = TransformerFactory.newInstance();

   Transformer tr = tf.newTransformer(new StreamSource(xslt));
    tr.transform(new StreamSource(xml),
     new StreamResult(new FileOutputStream(output)));

   System.out.println("Output to " + output);
   } catch (Exception e) {
    System.out.println(e);
   }
  }
}

→続きはこちら

「XML工房」のIndexへ戻る

ページトップへ▲

HOMEへ戻る