iPEX(アイペックス)コラム:XSLT [Part_02]

この文書では、iPEXにてXSLTを使用し、CSVファイルとXMLファイル間におけるデータの相互変換について解説します。解説にはWindows版C++用ライブラリ形式のiPEXを用います。

XML文書の形式変換

変換元XML文書

次にXSLTを用いて変換する元のXML文書books1.xmlの一部を示します。これは先に示したbooks1.csvをcsv2xml.exeを用いてXML文書に変換したものです。

<?xml version="1.0" encoding="shift_jis"?>
<doc>
  <row>
    <column1>type</column1>
    <column2>title</column2>
    <column3>author</column3>
    <column4>price</column4>
    <column5>published_year</column5>
    <column6>published_month</column6>
  </row>
</doc>

また、次にXML文書books1.xmlの構造を定義するDTDファイルbooks1.dtdを示します。

<!ELEMENT doc (row*)>
  <!ELEMENT row (column1, column2, column3, column4, column5, column6)>
    <!ELEMENT column1 (#PCDATA)>
    <!ELEMENT column2 (#PCDATA)>
    <!ELEMENT column3 (#PCDATA)>
    <!ELEMENT column4 (#PCDATA)>
    <!ELEMENT column5 (#PCDATA)>
    <!ELEMENT column6 (#PCDATA)>

変換先XML文書のDTD

次にbooks1.xmlからXSLTを用いて変換したいXMLデータの構造を定義するDTD、booklist1.dtdを示します。先に示したbooks1.dtdとの違いがわかると思います。この違う構造をもつXML文書を変換するルールをXSLにより記述します。

<!ELEMENT booklist (book*)>
  <!ELEMENT book (type, title, author+, price, published_date, note*)>
    <!ELEMENT type (#PCDATA)>
    <!ELEMENT title (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ELEMENT price (#PCDATA)>
    <!ELEMENT published_date (year, month)>
      <!ELEMENT year (#PCDATA)>
      <!ELEMENT month (#PCDATA)>
    <!ELEMENT note (#PCDATA)>

変換用XSL

次に変換用XSLのコードを示します。

<?xml version="1.0" encoding="shift_jis"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/">
  <booklist>
    <xsl:apply-templates select="doc"/>
  </booklist>
</xsl:template>

<xsl:template match="doc">
  <xsl:for-each select="row">
    <book>
      <type><xsl:value-of select="column1"/></type>
      <title><xsl:value-of select="column2"/></title>
      <author><xsl:value-of select="column3"/></author>
      <price><xsl:value-of select="column4"/></price>
      <published_date>
        <year><xsl:value-of select="column5"/></year>
        <month><xsl:value-of select="column6"/></month>
      </published_date>
    </book>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

XSLTプログラム

変換元XMLファイルならびに変換用のXSLファイルが準備できました。次のコマンドを用いてbooks1.xmlをbooks1.xslによって変換を行い、変換結果をXMLファイルbooklist2.xmlに出力します。

C:\>Xsltconv books1.xml books1.xsl

次は変換結果の一部です。

<booklist>
  <book>
    <type>computer</type>
    <title>The Art of Computer Programming</title>
    <author>Donald Ervin Knuth</author>
    <price>134.95</price>
    <published_date>
      <year>1998</year>
      <month>10</month>
    </published_date>
  </book>
</booklist>

XML文書のCSV形式への変換

ここまでCSV形式から、所定のDTDにより定義された構造をもつXML文書を得る方法について解説しました。
ここでは逆に、XML文書をCSVに変換する方法について解説します。

変換用XSL

<?xml version="1.0" encoding="shift_jis"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template>
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/">
<booklist>
  <xsl:apply-templates select="booklist"/>
</booklist>
</xsl:template>

<xsl:template match="booklist">
  <xsl:for-each select="book">
    <xsl:value-of select="type"/>,<xsl:value-of select="title"/>,<xsl:value-of select="author"/>,<xsl:value-of select="price"/>,<xsl:value-of select="published_date/year"/>,<xsl:value-of select="published_date/month"/>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

変換結果

xsltconv.exeはコマンドプロンプトにて次のコマンドを用いることにより、XMLファイルbooklist2.xmlをxml2csv.xslを用いて変換し、booklist2.csvを作成します。

C:\>xsltconv booklist2.xml xml2csv1.xsl > booklist2.csv

次に変換結果を示します。

<booklist>
type,title,author,price,published_year,published_month
computer,The Art of Computer Programming,Donald Ervin Knuth,134.95,1998,10
novel,Hannibal,Thomas Harris,22.36,1999,07
business,Business @ the Speed of Thought,Bill Gates,13.56,2000,05
</booklist>

© 2001 Infoteria Corporation

XSLT [Part_01]/[Part_02]

このページのトップ