XSLT完全ガイド:XMLを自在に変換する技術【初心者向け】

プログラミング・IT

XMLファイルをWebブラウザで開いたとき、「なんだか読みにくいな…」と感じたことはありませんか?

そんなとき活躍するのがXSLT(エックスエスエルティー)です。XSLTを使えば、XMLデータを読みやすいHTMLに変換したり、別の形式のXMLに変換したりできるんですよ。

今回は、XSLTの基本から実践的な使い方まで、初心者の方でも分かりやすく解説していきます。難しそうに見えるXSLTも、仕組みを理解すればとても便利なツールなんです!


スポンサーリンク

XSLTって何?まずは基本を理解しよう

XSLTは「Extensible Stylesheet Language Transformations」の略称です。

簡単に言うと、XMLを別の形式に変換するための言語ですね。XSL(スタイルシート言語)の一部として、XML文書の変換を専門に扱います。

XSLTの主な用途

  • XMLからHTMLへの変換:データを見やすいWebページに
  • XMLからPDFへの変換:印刷用のドキュメント作成
  • XMLからXMLへの変換:データ構造の変更
  • XMLからテキストへの変換:プレーンテキスト出力

「変換」と聞くと難しそうですが、要するにXMLデータを「読みやすい形」や「別の用途に適した形」に作り変えることなんです。


なぜXSLTが必要なの?

「わざわざ変換しなくても、プログラムで処理すればいいんじゃない?」と思うかもしれませんね。

でも、XSLTには大きなメリットがあります。

XSLTの利点

データと表現の分離

XMLファイルにはデータだけを保存して、見た目はXSLTで制御できます。データが変わっても、XSLTはそのまま使えるので便利ですよ。

再利用性が高い

一度作ったXSLTファイルは、同じ構造のXMLなら何度でも使えます。100個のXMLファイルがあっても、XSLTは1つでOKです。

標準化された技術

W3Cという国際標準化団体が定めた技術なので、様々なツールやプログラミング言語で使えます。

プログラミング不要

基本的な変換なら、プログラミング言語を使わずにXSLTだけで完結できます。


XSLTファイルの基本構造

実際のXSLTファイルがどんな形をしているのか見てみましょう。

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

    <!-- ルートテンプレート -->
    <xsl:template match="/">
        <html>
            <head>
                <title>変換結果</title>
            </head>
            <body>
                <!-- ここに変換ルールを書く -->
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

重要な要素の説明

xsl:stylesheet

すべてのXSLTファイルは、この要素で始まります。名前空間(namespace)を宣言して、XSLTの要素を使えるようにする役割があります。

xsl:template

変換のルールを定義する部分です。match属性で「どの要素を変換するか」を指定します。

match=”/”

これはXML文書のルート(一番上)を表します。最初にこのテンプレートが適用されますよ。


最初の実例:シンプルなXML→HTML変換

実際に動くコードで理解を深めましょう。

変換元のXMLファイル(books.xml)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="books.xsl"?>
<books>
    <book>
        <title>Python入門</title>
        <author>山田太郎</author>
        <price>2500</price>
    </book>
    <book>
        <title>Web開発の教科書</title>
        <author>佐藤花子</author>
        <price>3200</price>
    </book>
</books>

2行目の<?xml-stylesheet ...?>で、どのXSLTファイルを使うかを指定しています。

XSLTファイル(books.xsl)

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

    <xsl:template match="/">
        <html>
            <head>
                <title>書籍一覧</title>
                <style>
                    table { border-collapse: collapse; }
                    th, td { border: 1px solid #ddd; padding: 8px; }
                    th { background-color: #4CAF50; color: white; }
                </style>
            </head>
            <body>
                <h1>書籍一覧</h1>
                <table>
                    <tr>
                        <th>タイトル</th>
                        <th>著者</th>
                        <th>価格</th>
                    </tr>
                    <xsl:for-each select="books/book">
                        <tr>
                            <td><xsl:value-of select="title"/></td>
                            <td><xsl:value-of select="author"/></td>
                            <td><xsl:value-of select="price"/>円</td>
                        </tr>
                    </xsl:for-each>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

このXSLTを適用すると、XMLデータが綺麗な表形式のHTMLに変換されます!

主要な要素の説明

xsl:for-each

指定した要素を繰り返し処理します。この例では、すべての<book>要素に対してテーブルの行を生成していますね。

xsl:value-of

指定した要素の値(テキスト)を取り出します。select属性でどの要素を取り出すかを指定しますよ。


XPath式でデータを取得する

XSLTでは、XPathという記法を使ってXMLの要素を指定します。

よく使うXPath式

XPath式意味
/ルート要素/books
//任意の階層//title
.現在のノード./author
..親ノード../price
@属性@id
[]条件指定book[price > 2000]

実例で理解しよう

<xsl:template match="/">
    <!-- すべてのbook要素を取得 -->
    <xsl:for-each select="//book">

        <!-- 現在のbook要素のタイトルを出力 -->
        <xsl:value-of select="title"/>

        <!-- id属性を取得 -->
        <xsl:value-of select="@id"/>

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

XPath式を使いこなせると、複雑なXML構造からでもピンポイントでデータを取り出せます。


条件分岐:xsl:if と xsl:choose

特定の条件に応じて処理を変えたい場合もあります。

xsl:if(単純な条件分岐)

<xsl:for-each select="books/book">
    <xsl:if test="price &gt; 3000">
        <p style="color: red;">
            <xsl:value-of select="title"/> - 高価格帯
        </p>
    </xsl:if>
</xsl:for-each>

test属性に条件を書きます。注意点として、>&gt;<&lt;と書く必要がありますよ。これはXMLの文法ルールです。

xsl:choose(複数の条件分岐)

<xsl:for-each select="books/book">
    <xsl:choose>
        <xsl:when test="price &lt; 2000">
            <span class="low-price">お手頃</span>
        </xsl:when>
        <xsl:when test="price &lt; 3000">
            <span class="mid-price">標準価格</span>
        </xsl:when>
        <xsl:otherwise>
            <span class="high-price">高価格</span>
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>

xsl:chooseはプログラミング言語のswitch文やif-else文に似ていますね。


並べ替え:xsl:sort

データを特定の順序で表示したい場合は、xsl:sortを使います。

<xsl:for-each select="books/book">
    <!-- 価格の安い順に並べ替え -->
    <xsl:sort select="price" data-type="number" order="ascending"/>

    <tr>
        <td><xsl:value-of select="title"/></td>
        <td><xsl:value-of select="price"/>円</td>
    </tr>
</xsl:for-each>

属性の説明

  • select: 並べ替えの基準となる要素
  • data-type: データ型(numberまたはtext
  • order: 順序(ascending=昇順、descending=降順)

文字列でソートしたい場合はdata-type="text"を使いましょう。


テンプレートの再利用:xsl:apply-templates

複雑な変換では、複数のテンプレートを組み合わせて使います。

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

    <!-- ルートテンプレート -->
    <xsl:template match="/">
        <html>
            <body>
                <h1>書籍情報</h1>
                <xsl:apply-templates select="books/book"/>
            </body>
        </html>
    </xsl:template>

    <!-- bookテンプレート -->
    <xsl:template match="book">
        <div class="book-item">
            <h2><xsl:value-of select="title"/></h2>
            <p>著者: <xsl:value-of select="author"/></p>
            <p>価格: <xsl:value-of select="price"/>円</p>
        </div>
    </xsl:template>

</xsl:stylesheet>

xsl:apply-templatesを使うと、マッチする要素に対応するテンプレートが自動的に適用されます。コードが整理されて読みやすくなりますね。


実践例:商品カタログの変換

実際のビジネスシーンを想定した例を見てみましょう。

XML(products.xml)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="products.xsl"?>
<catalog>
    <product id="P001" category="electronics">
        <n>ワイヤレスマウス</n>
        <description>快適な操作性</description>
        <price>2980</price>
        <stock>50</stock>
    </product>
    <product id="P002" category="electronics">
        <n>メカニカルキーボード</n>
        <description>タイピングが楽しい</description>
        <price>8900</price>
        <stock>30</stock>
    </product>
    <product id="P003" category="accessories">
        <n>USBケーブル</n>
        <description>高速転送対応</description>
        <price>890</price>
        <stock>100</stock>
    </product>
</catalog>

XSLT(products.xsl)

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

    <xsl:template match="/">
        <html>
            <head>
                <title>商品カタログ</title>
                <style>
                    .product {
                        border: 2px solid #ddd;
                        padding: 15px;
                        margin: 10px;
                        border-radius: 8px;
                    }
                    .out-of-stock { background-color: #ffcccc; }
                    .in-stock { background-color: #ccffcc; }
                    .category {
                        display: inline-block;
                        padding: 3px 8px;
                        background-color: #4CAF50;
                        color: white;
                        border-radius: 3px;
                        font-size: 12px;
                    }
                </style>
            </head>
            <body>
                <h1>商品カタログ</h1>

                <!-- 価格の高い順に表示 -->
                <xsl:for-each select="catalog/product">
                    <xsl:sort select="price" data-type="number" order="descending"/>

                    <div>
                        <xsl:attribute name="class">
                            <xsl:text>product </xsl:text>
                            <xsl:choose>
                                <xsl:when test="stock &gt; 10">in-stock</xsl:when>
                                <xsl:otherwise>out-of-stock</xsl:otherwise>
                            </xsl:choose>
                        </xsl:attribute>

                        <span class="category">
                            <xsl:value-of select="@category"/>
                        </span>

                        <h2><xsl:value-of select="name"/></h2>
                        <p><xsl:value-of select="description"/></p>

                        <p>
                            <strong>価格: </strong>
                            <xsl:value-of select="format-number(price, '#,###')"/>円
                        </p>

                        <p>
                            <strong>在庫: </strong>
                            <xsl:value-of select="stock"/>個
                            <xsl:if test="stock &lt;= 10">
                                <span style="color: red;"> (残りわずか)</span>
                            </xsl:if>
                        </p>

                        <p>商品ID: <xsl:value-of select="@id"/></p>
                    </div>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

この例では、在庫状況に応じて背景色を変えたり、価格にカンマを追加したりしています。


便利な関数を使いこなそう

XSLTには、データを加工するための関数が用意されています。

文字列操作

<!-- 大文字に変換 -->
<xsl:value-of select="translate(title, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>

<!-- 文字列の一部を取得 -->
<xsl:value-of select="substring(description, 1, 20)"/>

<!-- 文字列の長さを取得 -->
<xsl:value-of select="string-length(name)"/>

<!-- 文字列の連結 -->
<xsl:value-of select="concat(author, ' 著')"/>

数値操作

<!-- 四捨五入 -->
<xsl:value-of select="round(price)"/>

<!-- 小数点以下切り上げ -->
<xsl:value-of select="ceiling(price)"/>

<!-- 小数点以下切り捨て -->
<xsl:value-of select="floor(price)"/>

<!-- 合計値を計算 -->
<xsl:value-of select="sum(//price)"/>

<!-- 要素の数を数える -->
<xsl:value-of select="count(//book)"/>

これらの関数を組み合わせることで、柔軟なデータ加工ができますよ。


XSLTプロセッサで変換を実行する

XSLTファイルを作ったら、実際に変換を実行する必要があります。

ブラウザで直接表示

最も簡単な方法は、XMLファイルに<?xml-stylesheet?>を記述してブラウザで開くことです。

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<data>...</data>

モダンなブラウザなら、自動的にXSLT変換が実行されて結果が表示されます。

コマンドラインツール

xsltproc(Linux/Mac)

xsltproc style.xsl data.xml > output.html

Saxon(Java)

java -jar saxon.jar -s:data.xml -xsl:style.xsl -o:output.html

プログラミング言語から実行

多くのプログラミング言語がXSLT変換をサポートしています。

Python

import lxml.etree as ET

# XMLとXSLTを読み込み
xml_doc = ET.parse('data.xml')
xslt_doc = ET.parse('style.xsl')

# 変換を実行
transform = ET.XSLT(xslt_doc)
result = transform(xml_doc)

# 結果を保存
with open('output.html', 'wb') as f:
    f.write(ET.tostring(result, pretty_print=True))

JavaScript(Node.js)

const xslt = require('xslt-processor');
const fs = require('fs');

const xmlString = fs.readFileSync('data.xml', 'utf8');
const xsltString = fs.readFileSync('style.xsl', 'utf8');

const result = xslt.transform(xslt.xmlParse(xsltString), xslt.xmlParse(xmlString));
fs.writeFileSync('output.html', result.toString());

プログラムから実行すれば、大量のXMLファイルを一括変換できます。


XSLT 1.0 と XSLT 2.0/3.0 の違い

XSLTにはバージョンがあり、それぞれ機能が異なります。

XSLT 1.0(最も広くサポート)

  • ブラウザサポート: ほぼすべてのブラウザ
  • 機能: 基本的な変換機能
  • 制限: 関数が少ない、文字列処理が弱い

XSLT 2.0/3.0(高機能版)

  • ブラウザサポート: 限定的
  • 機能: 正規表現、日付処理、グループ化など
  • プロセッサ: SaxonなどのツールRequired

初心者の方は、まずXSLT 1.0から始めることをおすすめします。ブラウザでも動作するので、学習しやすいですよ。


デバッグ:エラーを見つけやすくする

XSLTのデバッグは少し難しいことがあります。

よくあるエラーと対処法

何も表示されない

  • match属性のXPath式が間違っている可能性があります
  • ブラウザの開発者ツールでエラーメッセージを確認しましょう

文字化けする

  • XMLファイルとXSLTファイルのエンコーディングを統一してください
  • <?xml version="1.0" encoding="UTF-8"?>を確認しましょう

一部のデータが出ない

  • xsl:value-ofselect属性を確認してください
  • XPath式が正しいか、大文字小文字を間違えていないかチェックしましょう

デバッグ用のテクニック

<!-- 現在処理中のノード名を表示 -->
<xsl:value-of select="name()"/>

<!-- すべての子要素を表示 -->
<xsl:copy-of select="."/>

<!-- コメントでメッセージを出力 -->
<xsl:comment>ここまで到達しました</xsl:comment>

段階的にチェックポイントを入れながら、どこまで正しく動いているか確認するといいですね。


XSLTの実用的な活用例

実際のビジネスシーンで、XSLTがどう使われているか見てみましょう。

レポート生成

データベースから出力したXMLを、見やすいHTMLレポートに変換できます。日次・月次の報告書作成を自動化できますね。

データ移行

異なるシステム間でデータを交換するとき、XML構造の違いをXSLTで吸収できます。A社のXMLをB社のフォーマットに変換するような用途です。

RSS/Atomフィードの整形

ブログのRSSフィードを、見やすいWebページに変換して表示できます。

請求書や納品書の生成

XMLの注文データから、印刷用のPDFやHTMLを生成できます。FOPなどのツールと組み合わせることで、本格的なドキュメント生成システムが作れますよ。


よくある質問

Q: XSLTとCSSの違いは?

A: CSSは「見た目のスタイル」だけを変更しますが、XSLTは「構造そのもの」を変換できます。XMLをHTMLに変えたり、データの順序を入れ替えたりできるのがXSLTの特徴です。

Q: 複雑な変換はプログラミング言語を使った方がいい?

A: ケースバイケースですね。シンプルな変換ならXSLTが便利ですが、複雑なビジネスロジックを含む場合はPythonやJavaなどを使う方が効率的でしょう。

Q: XSLTは今でも現役で使われている?

A: はい、特にエンタープライズシステムや文書管理システムでは現役です。ただし、最近ではJSON形式のデータが増えたため、新規プロジェクトではXSLTを選ばないケースも増えています。

Q: 学習コストはどのくらい?

A: 基本的な変換なら数時間で習得できます。ただし、複雑なXPath式や高度なテンプレート設計をマスターするには、もう少し時間がかかるでしょう。


まとめ:XSLTでXMLを使いこなそう

XSLTについて、重要なポイントをおさらいします。

今日学んだこと:

  • XSLTはXMLを別の形式に変換する技術
  • データと表現を分離できる利点がある
  • XPathでXML要素を柔軟に指定できる
  • テンプレートマッチングで変換ルールを定義
  • 条件分岐や並べ替えも可能
  • ブラウザやコマンドラインで実行できる
  • ビジネスシーンでの実用例も豊富

XSLTは一見とっつきにくい技術に見えますが、基本を押さえれば強力なツールです。

XMLデータを扱う仕事をしているなら、XSLTを習得しておいて損はありません。特にレポート生成やデータ変換の自動化では、プログラミングよりも効率的なケースもありますよ。

最初はシンプルな変換から始めて、徐々に複雑な処理にチャレンジしていくといいでしょう。実際に手を動かして試してみることが、上達への近道です!


コメント

タイトルとURLをコピーしました