XML文書をCSVに変換する その3 – XSLTの条件式・関数 –

前回に引き続きXSLTを使ってXMLをCSVに変換する処理を紹介します。
条件式(IF文)と文字列変換をする関数を組み込んでいきます。

XML文書の準備

前回使用したXML文書(books.xml)に<recommend>要素を追加します。

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <book_data>
    <title>機動警察パトレイバー 1</title>
    <author>ゆうきまさみ</author>
    <description>国家規模の土地開発計画「バビロンプロジェクト」を背景に、巨大ロボット・レイバーが活躍する近未来の東京。
レイバーによる犯罪が続発し、警視庁はそれに対抗するべく、警視庁特車部隊、通称「パトレイバー」を創設!
パイロット・泉野明(いずみのあ)は愛機イングラムと共に、戦い、成長していく!!</description>
    <volume>
      <episode>Prolog</episode>
      <episode>第1話 ザ・ライトスタッフ</episode>
    </volume>
    <recommend>5</recommend>
  </book_data>
  <book_data>
    <title>機動警察パトレイバー 2</title>
    <author>ゆうきまさみ</author>
    <description>特車隊”イングラム”対軍事用レイバー・タイプ7“ブロッケン”!!なんでこんなごついレイバーが日本に…なんて問題はあとまわし。
とにかく戦わなければいけない第2小隊!!こいつは手強い相手になりそうだ…!?</description>
    <volume>
      <episode>第2話 シャフト!</episode>
      <episode>第3話 活性因子</episode>
    </volume>
    <recommend>3</recommend>
  </book_data>
  <book_data>
    <title>機動警察パトレイバー 3</title>
    <author>ゆうきまさみ</author>
    <description>知らず知らずのうちに、悪漢・内海と出会った野明と遊馬。さらに、天才少年・バドが現れ、ますます進むシャフトの悪だくみ。
そして、最後のブロッケンが今、港湾地区に出現した。特車2課、緊急出動!!</description>
    <volume>
      <episode>"閑話休題"その壱</episode>
      <episode>"閑話休題"完結編</episode>
      <episode>第4話 GAME MAKER</episode>
    </volume>
    <recommend>4</recommend>
  </book_data>
</books>

XSLファイル作成

XML文書からタイトル・著者・エピソードの一覧を出力するXSLファイルを作成します。XMLと同じ場所に保管します。
おすすめ巻(recommendが3より上)という条件を付けます。

title,author,episode
本のタイトル,著者,エピソード


book_episode.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>

<xsl:template match="/">
  <xsl:text>title,author,episode&#10;</xsl:text>
  <xsl:apply-templates select="books/book_data/volume/episode"/>
</xsl:template>

<xsl:template match="books/book_data/volume/episode">
  <xsl:if test="../../recommend &gt; 3">
    <xsl:value-of select="../../title"/><xsl:text>,</xsl:text>
    <xsl:value-of select="../../author"/><xsl:text>,</xsl:text>
    <xsl:value-of select="translate(.,'&quot;','”')"/><xsl:text>&#10;</xsl:text>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>

9行目:1巻あたり複数収録されている<episode>をすべて表示したいので「books/book_data/volume/episode」を指定します。
10行目:IF文で抽出条件「recommendが3より上」を指定します。
「../../recommend」は<episode>からみて二つ上の階層にある<recommend>を指します。ディレクトリやURLで使う相対PATHと同じ書き方。
「&gt;」は「>」のことです。XMLタグとみなされないようエスケープ文字で記述します。ちなみに「<」は「&lt;」と記述します。
13行目:translate()関数を使って要素内に含まれる半角ダブルクォーテーション(&quot;)を全角文字に変更します。()の中の「.」は現在の要素(今回の場合は<episode>)を指します。

変換実行

XSLTプロセッサ(Xalan)を使ってXMLファイルからcsvファイルを出力します。

(1) ターミナルからXalanの実行コマンドを入力します。続けてBOM付きのcsvファイルを出力します。(BOM付きにしないとExcelで文字化けするので)
 java org.apache.xalan.xslt.Process -IN XMLファイル -XSL XSLファイル -OUT 出力ファイル
 Get-Content -Encoding utf8 元ファイル | Set-Content 出力ファイル -Encoding utf8BOM

xml_csv5

(2) 以下のようなcsvファイルが作成されました。おすすめ巻(recommendが3より上)のエピソードが出力されています。

xml_csv6