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 > 3000">
<p style="color: red;">
<xsl:value-of select="title"/> - 高価格帯
</p>
</xsl:if>
</xsl:for-each>
test属性に条件を書きます。注意点として、>は>、<は<と書く必要がありますよ。これはXMLの文法ルールです。
xsl:choose(複数の条件分岐)
<xsl:for-each select="books/book">
<xsl:choose>
<xsl:when test="price < 2000">
<span class="low-price">お手頃</span>
</xsl:when>
<xsl:when test="price < 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 > 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 <= 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-ofのselect属性を確認してください- 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を習得しておいて損はありません。特にレポート生成やデータ変換の自動化では、プログラミングよりも効率的なケースもありますよ。
最初はシンプルな変換から始めて、徐々に複雑な処理にチャレンジしていくといいでしょう。実際に手を動かして試してみることが、上達への近道です!


コメント