2008年04月02日

XMLの要素から属性への変換

XMLではデータを要素形式か、属性形式で表すことができます。
どちらの形式でも良いのですが、作成済みのXMLファイルで要素から属性、または属性から要素に変換したい場合、XSLTを使用することで変換できます。

例えば以下のようなXLMファイル(ファイル名:library.xml)がある場合
<?xml version="1.0" encoding="UTF-8"?>
<library>
<category id="A1">
<name>XML</name>
<book id="9784894714816">
<title>XSLT Web開発者ガイド</title>
<price>3400</price>
</book>
<book id="9784873112213">
<title>XML HACKS</title>
<price>3200</price>
</book>
</category>

<category id="A2">
<name>MySQL</name>
<book id="9784873112091">
<title>実践ハイパフォーマンスMySQL</title>
<price>3600</price>
</book>
<book id="9784873111551">
<title>MySQLクックブック VOLUME 1</title>
<price>5400</price>
</book>
<book id="9784873111667">
<title>MySQLクックブック VOLUME 2</title>
<price>4400</price>
</book>
</category>
</library>


このXMLの要素全てを属性への変換するXSLTスタイルシート(ファイル名:elem2attr.xml)は以下のようになります。

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

<xsl:template match="library">
<xsl:copy>
<xsl:for-each select="category">
<xsl:copy>
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>


<xsl:attribute name="name">
<xsl:value-of select="name"/>
</xsl:attribute>


<xsl:for-each select="book">
<xsl:copy>
<xsl:attribute name="id">
<xsl:value-of select="@id"/>
</xsl:attribute>


<xsl:for-each select="*">
<xsl:attribute name="{name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>

</xsl:copy>
</xsl:for-each>

</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>


注. 大雑把に言うと、要素 → 属性に変換している部分は赤色で、要素 → 要素の部分は青色となります。

このXSLTスタイルシートで変換した結果は以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<library>
<category id="A1" name="XML">
<book id="9784894714816" title="XSLT Web開発者ガイド" price="3400"/>
<book id="9784873112213" title="XML HACKS" price="3200"/>
</category>
<category id="A2" name="MySQL">
<book id="9784873112091" title="実践ハイパフォーマンスMySQL" price="3600"/>
<book id="9784873111551" title="MySQLクックブック VOLUME 1" price="5400"/>
<book id="9784873111667" title="MySQLクックブック VOLUME 2" price="4400"/>
</category>
<library>


・XSLTプロセッサ
XSLTプロセッサはXalanを使用します。XalanはJava版と、C++版がありますが、C++版はインデントを指定できますので、C++版の方を使用します。
http://xalan.apache.org/Xalan から、Xalan C++と、Xerces-C++ をダウンロードして、適当なディレクトリに展開し、パスを設定します。設定できたら変換するXMLファイル、XSLTスタイルシートがあるディレクトリで以下のように指定して実行すれば変換ができます。

xalan -o [変換後のXML] [変換前XML] [XSLTスタイルシート]


変換前XML: library.xml
XSLTスタイルシート:elem2attr.xsl
変換後XML: out.xml
上記のファイル名で、インデントを2とすると以下のように指定して変換します。

> xalan -i 2 -o out.xml library.xml elem2attr.xsl

参考書籍
・XML HACKS (オライリー・ジャパン)
posted by jun1 at 00:32| Comment(0) | TrackBack(0) | XML
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/13457283

この記事へのトラックバック