XML文書をCSVに変換する その2 – XSLT変換 –

XSLTプロセッサ(前回インストールしたXalan)を使ってXML文書からcsvファイルを出力します。
XMLとXSLファイルはテキストエディタで作成してください。この記事のコードをそのままコピーして使えます。

XML文書の準備

まず元ネタとなるXML文書(books.xml)を作成します。ここではC:\XMLというフォルダを作成して保管しました。

XML

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>
  </book_data>
  <book_data>
    <title>機動警察パトレイバー 2</title>
    <author>ゆうきまさみ</author>
    <description>特車隊”イングラム”対軍事用レイバー・タイプ7“ブロッケン”!!なんでこんなごついレイバーが日本に…なんて問題はあとまわし。
とにかく戦わなければいけない第2小隊!!こいつは手強い相手になりそうだ…!?</description>
    <volume>
      <episode>第2話 シャフト!</episode>
      <episode>第3話 活性因子</episode>
    </volume>
  </book_data>
  <book_data>
    <title>機動警察パトレイバー 3</title>
    <author>ゆうきまさみ</author>
    <description>知らず知らずのうちに、悪漢・内海と出会った野明と遊馬。さらに、天才少年・バドが現れ、ますます進むシャフトの悪だくみ。
そして、最後のブロッケンが今、港湾地区に出現した。特車2課、緊急出動!!</description>
    <volume>
      <episode>"閑話休題"その壱</episode>
      <episode>"閑話休題"完結編</episode>
      <episode>第4話 GAME MAKER</episode>
    </volume>
  </book_data>
</books>

XSLファイル作成

XML文書からタイトル・著者・説明の一覧を出力するXSLファイルを作成します。XMLと同じ場所に保管します。

XSL

title,author,description
本のタイトル,著者,”説明文…”


book_title.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,description&#10;</xsl:text>
  <xsl:apply-templates select="books/book_data"/>
</xsl:template>

<xsl:template match="books/book_data">
  <xsl:value-of select="title"/><xsl:text>,</xsl:text>
  <xsl:value-of select="author"/><xsl:text>,</xsl:text>
  <xsl:text>"</xsl:text><xsl:value-of select="description"/><xsl:text>"&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>

2行目:text形式に変換するという命令です。
5行目:見出し行を出力しています。&#10;は改行です。文字列はtextタグで囲います。
6行目:データ部分のテンプレート(9行目から)を呼んでいます。select属性に呼び出すテンプレートのmatch属性の値を指定します。
9行目:テンプレートです。match属性にこのテンプレートで処理するノードを指定します。今回出力したいタイトル・著者・説明が含まれているノードは「books/booka_data」ですね。
10行目:value-ofタグで出力するデータ項目を指定します。区切り文字のカンマをtextタグで出力しています。
12行目:説明文はカンマが含まれる可能性のある項目なのでダブルクォーテーションで囲いました。

変換実行

XSLTプロセッサ(Xalan)を使ってXMLファイルをcsvファイルに変換します。

CSV

(1) ターミナルからコマンド実行します。XMLとXSLファイルを保存したフォルダに移動して以下のコマンドを入力してください。
 java org.apache.xalan.xslt.Process -IN XMLファイル -XSL XSLファイル -OUT 出力ファイル

xml_csv2

csvファイルが出力されました。Excelで開いてみると文字化けしています…

xml_csv3

ExcelはBOMコードが付加されていないcsvファイルを読み込むとマルチバイト文字を正しく判別できません。
今回はExcelで開いて使いたいのでcsvファイルをBOM付UTF-8に変換します。

(2) ターミナルから以下のコマンドを入力してください。
 Get-Content -Encoding utf8 元ファイル | Set-Content 出力ファイル -Encoding utf8BOM

xml_csv4

今度はExcelで正しく表示されていますね。

xml_csv1