前回に引き続き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 </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 > 3">
<xsl:value-of select="../../title"/><xsl:text>,</xsl:text>
<xsl:value-of select="../../author"/><xsl:text>,</xsl:text>
<xsl:value-of select="translate(.,'"','”')"/><xsl:text> </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と同じ書き方。
「>」は「>」のことです。XMLタグとみなされないようエスケープ文字で記述します。ちなみに「<」は「<」と記述します。
13行目:translate()関数を使って要素内に含まれる半角ダブルクォーテーション(")を全角文字に変更します。()の中の「.」は現在の要素(今回の場合は<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
(2) 以下のようなcsvファイルが作成されました。おすすめ巻(recommendが3より上)のエピソードが出力されています。