はてなダイアリーをはじめ,ブログサービスを提供しているサイトは数多く存在します。その中でもJUGEMは,はてなダイアリーと同様にXML形式で日記をエクスポート,インポートすることができます。しかし,はてなダイアリーとJUGEMではXML文書の構造が異なるため,はてなダイアリーからJUGEMに移行したい場合は,XML文書の構造を変換する必要があります。

 XML文書の構造を変換するには,さまざまな方法があります。XSLT(XSL Transformations)を利用してXML文書の構造変換を行なう方法も,その1つです。

 そこで今回から3回にわたって,はてなダイアリーからエクスポートしたXML文書(以下,はてなダイアリー形式)をJUGEMブログにインポートするための形式(以下,JUGEM形式)に変換するXSLTスタイルシートを例に,XSLTの基本構文を学習します。

◇XSLTとは

 XSLTとは,XML文書を別の構造のXML文書や,他の構造のデータ(HTMLやCSVなど)に変換するための仕組みを規定した仕様です。

 XMLの変換ルールを記述したものをXSLTスタイルシートと言います。元となるXML文書とXSLTスタイルシートをXSLTプロセッサと呼ぶソフトに渡すことで,別の構造のXML文書や他の構造のデータ(HTMLやCSVなど)に変換することができます(図1)。

図1●XSLT変換処理の流れ

 はてなダイアリー形式のXML文書(第1回の例1)に,例2で示したXSLTスタイルシートを使って変換した結果を以下に示します。

例1:はてなダイアリー形式XML文書からJUGEM形式XML文書に変換した結果

[画像のクリックで拡大表示]

例2:はてなダイアリー形式からJUGEM形式に変換するXSLTスタイルシート
行番号は解説の便宜上付けたもので,実際のコードには必要ありません

[画像のクリックで拡大表示]

◇XSLTスタイルシートはXML文書

 XSLTスタイルシートは,XMLの文法を用いて記述し,整形式XML文書(前回参照)にしなければなりません。XSLTスタイルシートには,XMLの開始タグ(<blog>など)や終了タグ(</blog>など),HTMLのタグ,変換結果に出力したい文字列などをそのまま記述することができます。ただし,HTMLのタグを記述する場合には,HTMLの記述方法をXMLの記述方法に変換する必要があります(表1)。

表1●HTMLタグを記述する場合の注意点
記述 HTMLの場合 XMLの場合
タグの入れ子 <a>あい<b>うえ</a></b> <a>あい<b>うえ</b></a>
空要素の記述 <BR> <BR/>
終了タグの省略 <P>あいうえお <P>あいうえお</P>
属性の記述 <TABLE border=1> <TABLE border="1">
<OPTION selected> <OPTION selected="selected">

確認問題1
次のXSLTスタイルシートの説明について,誤ったものを選択してください。

(a) XSLTスタイルシートは整形式XML文書である

(b) XSLTスタイルシートにはXMLのタグをそのまま記述できる

(c) XSLTスタイルシートにはすべてのHTMLのタグをそのまま記述できる

(d) XSLTスタイルシートには変換結果に出力したい文字列をそのまま記述できる

 正解は(c)です。XSLTスタイルシートでHTMLのタグを記述する場合は,HTMLの記述をXMLの記述に変えなければなりません。例えば,<BR>タグをXSLTスタイルシートに記述する場合は,<BR/>のようにXMLの空要素(第1回参照)として記述します。

 では例2を基に,XSLTスタイルシートの各要素を見ていきましょう。

xsl:stylesheet要素

[画像のクリックで拡大表示]

 xsl:stylesheet要素(2行目)は,XSLTスタイルシートの最上位要素(ルート要素)となります。version属性は必須で,XSLT1.0の場合,必ず1.0としなければなりません。また,XSLTの要素はすべて『http://www.w3.org/1999/XSL/Transform』という名前空間(要素名のセットと一対一に対応するものでURLなどで記述します。別の回で詳しく説明します)に属さなければなりません。

xsl:output要素

  <xsl:output cdata-section-elements="description" />

 xsl:output要素(4行目)は,出力される変換結果を制御する際に使用します。出力方式を指定するmethod属性や出力する際の文字エンコーディングを指定するencoding属性などがあります。ここでは,指定された要素をCDATAセクション(前回参照)として出力するためのcdata-section-elements属性を記述しています。cdata-section-elements属性にdescription要素を指定することで,description要素の内容はCDATAセクションとして出力されるようになります。

xsl:template要素

  <xsl:template match="/">
  ・・・
  </xsl:template>

 元となるXML文書のある特定の要素の具体的な変換方法をテンプレートルールと呼び,xsl:template要素(6行目~32行目)を使用して記述します。xsl:template要素の内容となる変換方法の記述のことをテンプレートと言います。XSLTスタイルシートの基本構成要素となるテンプレートルールは,複数記述することができます。

 xsl:template要素のmatch属性は,XPath式を記述します。XPathとは,XML文書の中のノード(要素や属性)を指し示すための式の構文のことで,ノードの選択以外にも演算子や関数を含む式を記述することができます。UNIX系のOSでファイルパスを指定するのと同様に,要素名などをスラッシュ(/)で区切って指定します。

 例2のxsl:template要素のmatch属性(6行目)では「/」が指定されています(match="/")。「/」はルートノードという意味で,ルート要素よりも上を指します。XSLTプロセッサは,ここで指定された場所から処理を開始します。例2では,ルートノードを指定しているので,XSLTスタイルシートの変換処理は,ルートノードから処理されます。

xsl:for-each命令

  <xsl:for-each select="diary/day">
    ・・・
  </xsl:for-each>

 xsl:for-each命令(例2の18行目)は,select属性で指定されたXPath式が示すすべてのノードに対して,xsl:for-each命令内で記述されたテンプレートを実行します。この例では,diary要素の子要素であるday要素は2つありますので,この2つのday要素に対して,xsl:for-each命令内で記述されているテンプレートが実行されることになります。

xsl:value-of命令

 <xsl:value-of select="body" />

 select属性で指定したノードから値を取得するには,xsl:value-of命令(例2の20行目,24行目)を使用し,select属性にはXPath式を記述します。要素から値を取得するには「要素名」,属性から値を取得するするには「@属性名」を記述します。

title属性の値を取得する例

  <xsl:value-of select="@title" />

 また,ある要素の子要素や属性などの値を取得する場合には,ある要素名と子要素名や属性名の間をスラッシュで区切って記述します。

day要素の子要素であるbody要素の値を取得する例
  <xsl:value-of select="day/body" />

day要素のtitle属性の値を取得する例

 <xsl:value-of select="day/@title" />

 さらにselect属性にはXPathで使用できる関数を記述することもできます(例2の23行目)。ここでは,translate関数を使用し,date属性値の区切り文字を「-」から「/」に置換しています。

  <date><xsl:value-of select="translate(@date,'-','/')" /></date>

確認問題2
次の要素または命令の中でXSLTスタイルシートの最上位要素(ルート要素)となるものを選択してください。

(a) xsl:template要素

(b) xsl:stylesheet要素

(c) xsl:output要素

(d) xsl:value-of命令

(e) xsl:for-each命令

 正解は(b)です。(a)はテンプレートルールを記述するための要素でXSLTスタイルシートの基本構成要素です。 (c)は変換結果の出力を制御するための要素で,出力方式を指定するmethod属性や出力する際の文字エンコーディングを指定するencoding属性,出力結果にインデントを付加するindent属性などがあります。(d)はselect属性で指定されたノードから値を取得するための命令です。(e)はselect属性で指定されたXPath式が返すノードセットの全ノードに対してテンプレートを繰り返す命令です。



野中 康弘
インフォテリア 教育部 エンジニア。十数年間システム開発に携わり,そのうちの半分をデータベース管理者として奮闘する。現在は,インフォテリア認定教育センターのサポートや,XML技術者認定制度の「XMLマスター」に対応したコーステキストの開発などを担当している。