2008年04月03日

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

前回の逆で、XSLTを使ったXMLの属性を要素へ変換する方法

以下のようなXMLの場合
<?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>


このXMLの全ての属性を要素への変換するXSLTスタイルシート(ファイル名:attr2elem.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="*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="@*">
<xsl:element name="{name(.)}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>


</xsl:stylesheet>

注. 上記で赤色の部分が属性 → 要素の変換を指定している箇所です。

以下のようなファイル名で、インデントを2とする場合
変換前XML: library.xml
XSLTスタイルシート:attr2elem.xsl
変換後XML: out.xml

xalanを使用した変換は以下のようなコマンドになります。
> xalan -i 2 -o out.xml library.xml attr2elem.xml


上記を実行すると以下のように変換されます。
<?xml version="1.0" encoding="UTF-8"?>
<library>
<category>
<id>A1</id>
<name>XML</name>
<book>
<id>9784894714816</id>
<title>XSLT Web開発者ガイド</title>
<price>3400</price>
</book>
<book>
<id>9784873112213</id>
<title>XML HACKS</title>
<price>3200</price>
</book>
</category>
<category>
<id>A2</id>
<name>MySQL</name>
<book>
<id>9784873112091</id>
<title>実践ハイパフォーマンスMySQL</title>
<price>3600</price>
</book>
<book>
<id>9784873111551</id>
<title>MySQLクックブック VOLUME 1</title>
<price>5400</price>
</book>
<book>
<id>9784873111667</id>
<title>MySQLクックブック VOLUME 2</title>
<price>4400</price>
</book>
</category>
</library>


参考書籍
・XML HACKS (オライリー・ジャパン)

posted by jun1 at 01:13| Comment(0) | TrackBack(0) | XML
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

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

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