WebサイトやシステムでXMLファイルを扱っていて、「このデータを別の形式に変換したい」「HTMLとして表示したい」と思ったことはありませんか?
「XMLは読めるけど、どうやって変換すればいいの?」「XSLTって難しそう…」「プログラミングなしで変換できないかな?」と悩んでいる方も多いはずです。
実は、xsltprocは、XSLTスタイルシートを使ってXMLデータを別の形式に変換できる、シンプルで強力なコマンドラインツールなんです。まるで、翻訳家のように、XMLという言語を別の言語(HTML、テキスト、別のXMLなど)に変換してくれるんですよ。
この記事では、xsltprocの基本から実践的な使い方まで、初心者の方にも分かりやすく丁寧に解説していきます。
具体的な例をたくさん見ながら、XMLデータの変換をマスターしていきましょう!
xsltprocとは?その基本を知ろう

基本的な説明
xsltproc(エックスエスエルティープロック)は、XMLファイルをXSLTスタイルシートを使って変換するコマンドラインツールです。
libxsltライブラリをベースにしたオープンソースのツールで、Linux/Unix環境で標準的に使われています。
名前の由来:
- XSLT:eXtensible Stylesheet Language Transformations
- proc:processor(プロセッサ)
つまり、「XSLT変換を処理するツール」という意味なんです。
何ができるの?
主な機能:
XMLからHTMLへの変換:
XMLデータをWebページとして表示できる形式に変換します。
XMLから別のXMLへの変換:
データ構造を変更したり、必要な部分だけを抽出したりできます。
XMLからテキストへの変換:
CSVやプレーンテキストとして出力できます。
データの抽出と加工:
大きなXMLファイルから必要な情報だけを取り出せます。
バッチ処理:
複数のXMLファイルを一括変換できます。
日常の例で理解しよう
料理のレシピ変換:
XML = 材料と手順のデータ
生のデータが書かれている
XSLT = レシピ本のテンプレート
どう表示するか、どう加工するかのルール
xsltproc = 料理人
テンプレートに従って、データを調理(変換)する
HTML = 完成した料理
見やすく、食べやすい(読みやすい)形になっている
xsltprocは、データを「調理」するツールなんですね。
XMLとXSLTの基礎知識
XML(eXtensible Markup Language)
XMLは、データを構造化して保存・交換するためのマークアップ言語です。
例:書籍データのXML
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="1">
<title>プログラミング入門</title>
<author>山田太郎</author>
<year>2023</year>
<price>2800</price>
</book>
<book id="2">
<title>Web開発の基礎</title>
<author>鈴木花子</author>
<year>2024</year>
<price>3200</price>
</book>
</library>
特徴:
- タグで囲まれた階層構造
- 人間にも機械にも読める
- 自由に項目を定義できる
XSLT(eXtensible Stylesheet Language Transformations)
XSLTは、XMLを別の形式に変換するための言語です。
例:書籍データをHTMLテーブルに変換する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>
<h1>図書館の蔵書</h1>
<table border="1">
<tr>
<th>タイトル</th>
<th>著者</th>
<th>出版年</th>
<th>価格</th>
</tr>
<xsl:for-each select="library/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="year"/></td>
<td><xsl:value-of select="price"/>円</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XSLTは、XMLと似た構文ですが、変換のルールを記述するものなんです。
インストール方法
Linux(Ubuntu/Debian)
インストール:
sudo apt update
sudo apt install xsltproc
バージョン確認:
xsltproc --version
出力例:
Using libxml 20912, libxslt 10134 and libexslt 820
xsltproc was compiled against libxml 20912, libxslt 10134 and libexslt 820
libxslt 10134 was compiled against libxml 20912
libexslt 820 was compiled against libxml 20912
Linux(CentOS/RHEL/Fedora)
sudo dnf install libxslt
# または
sudo yum install libxslt
xsltprocは、libxsltパッケージに含まれています。
macOS
Homebrewを使用:
brew install libxslt
または、macOSには標準で入っている場合が多いです:
which xsltproc
# /usr/bin/xsltproc
Windows
方法1:WSL(Windows Subsystem for Linux)を使う
WSL内でLinuxと同じ手順でインストールします。
方法2:Cygwinを使う
Cygwinのセットアップでlibxsltパッケージを選択します。
方法3:バイナリをダウンロード
から、Windows用のバイナリをダウンロードして配置します。
基本的な使い方
最もシンプルな変換
書式:
xsltproc スタイルシート.xsl 入力.xml
例:
xsltproc books.xsl library.xml
これだけで、XMLファイルが変換されて、結果が標準出力(画面)に表示されます。
ファイルに出力
書式:
xsltproc -o 出力ファイル スタイルシート.xsl 入力.xml
例:
xsltproc -o output.html books.xsl library.xml
-oオプションで、結果をファイルに保存できます。
実際の例で確認
library.xml(入力XML):
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>Linuxコマンド入門</title>
<author>田中一郎</author>
<price>2500</price>
</book>
<book>
<title>Python基礎</title>
<author>佐藤美咲</author>
<price>3000</price>
</book>
</library>
books.xsl(XSLTスタイルシート):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<h2>書籍リスト</h2>
<ul>
<xsl:for-each select="library/book">
<li>
<strong><xsl:value-of select="title"/></strong>
- <xsl:value-of select="author"/>
(<xsl:value-of select="price"/>円)
</li>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
実行:
xsltproc -o books.html books.xsl library.xml
出力(books.html):
<html>
<body>
<h2>書籍リスト</h2>
<ul>
<li><strong>Linuxコマンド入門</strong> - 田中一郎(2500円)</li>
<li><strong>Python基礎</strong> - 佐藤美咲(3000円)</li>
</ul>
</body>
</html>
XMLデータがHTMLに変換されました!
よく使うオプション
-o, –output(出力先の指定)
xsltproc -o result.html style.xsl input.xml
結果を指定したファイルに保存します。
–novalid(DTD検証を無効化)
xsltproc --novalid style.xsl input.xml
XML文書の妥当性検証をスキップします。処理が速くなります。
–nonet(ネットワークアクセスを禁止)
xsltproc --nonet style.xsl input.xml
外部リソースへのネットワークアクセスを禁止します。セキュリティ向上に有効です。
–param(パラメータの指定)
xsltproc --param year 2024 style.xsl input.xml
XSLTスタイルシートにパラメータを渡せます。
XSLT側でパラメータを受け取る:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="year"/>
<xsl:template match="/">
<html>
<body>
<h1><xsl:value-of select="$year"/>年の書籍</h1>
<!-- ... -->
</body>
</html>
</xsl:template>
</xsl:stylesheet>
–stringparam(文字列パラメータ)
xsltproc --stringparam title "書籍一覧" style.xsl input.xml
--paramは数値向け、--stringparamは文字列向けです。
-v, –verbose(詳細表示)
xsltproc -v style.xsl input.xml
処理の詳細を表示します。デバッグに便利です。
–maxdepth(再帰の深さ制限)
xsltproc --maxdepth 5000 style.xsl input.xml
テンプレートの再帰呼び出しの最大深さを指定します。
デフォルトは3000で、深い再帰が必要な場合に増やします。
–timing(処理時間の表示)
xsltproc --timing style.xsl input.xml
処理にかかった時間を表示します。
出力例:
Parsing stylesheet took 15 ms
Parsing document took 8 ms
Applying stylesheet took 42 ms
実践的な使用例

例1:RSSフィードをHTMLに変換
rss.xml(RSSフィード):
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>技術ブログ</title>
<link>https://example.com</link>
<description>最新の技術情報</description>
<item>
<title>Linuxコマンド入門</title>
<link>https://example.com/linux</link>
<description>基本的なコマンドを解説</description>
<pubDate>2024-01-15</pubDate>
</item>
<item>
<title>Docker入門</title>
<link>https://example.com/docker</link>
<description>コンテナ技術の基礎</description>
<pubDate>2024-01-20</pubDate>
</item>
</channel>
</rss>
rss2html.xsl(変換スタイルシート):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<html>
<head>
<title><xsl:value-of select="rss/channel/title"/></title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.article { border: 1px solid #ccc; padding: 15px; margin: 10px 0; }
.date { color: #666; font-size: 0.9em; }
</style>
</head>
<body>
<h1><xsl:value-of select="rss/channel/title"/></h1>
<p><xsl:value-of select="rss/channel/description"/></p>
<xsl:for-each select="rss/channel/item">
<div class="article">
<h2>
<a href="{link}">
<xsl:value-of select="title"/>
</a>
</h2>
<p class="date"><xsl:value-of select="pubDate"/></p>
<p><xsl:value-of select="description"/></p>
</div>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
実行:
xsltproc -o rss.html rss2html.xsl rss.xml
RSSフィードが見やすいHTMLページに変換されます。
例2:CSVへの変換
products.xml:
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product>
<id>001</id>
<name>ノートPC</name>
<price>89800</price>
<stock>15</stock>
</product>
<product>
<id>002</id>
<name>マウス</name>
<price>1200</price>
<stock>50</stock>
</product>
</products>
xml2csv.xsl:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
<!-- ヘッダー行 -->
<xsl:text>ID,商品名,価格,在庫</xsl:text>
<xsl:text> </xsl:text>
<!-- データ行 -->
<xsl:for-each select="products/product">
<xsl:value-of select="id"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="name"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="price"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="stock"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
実行:
xsltproc -o products.csv xml2csv.xsl products.xml
出力(products.csv):
ID,商品名,価格,在庫
001,ノートPC,89800,15
002,マウス,1200,50
XMLがCSVに変換されました。Excelで開けますね。
例3:データのフィルタリング
books.xml:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>入門Python</title>
<category>プログラミング</category>
<price>2800</price>
</book>
<book>
<title>料理の基本</title>
<category>料理</category>
<price>1500</price>
</book>
<book>
<title>JavaScript入門</title>
<category>プログラミング</category>
<price>3200</price>
</book>
</library>
filter_programming.xsl(プログラミング書籍のみ抽出):
<?xml version="1.0" encoding="UTF-8"?>
<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:for-each select="library/book[category='プログラミング']">
<book>
<title><xsl:value-of select="title"/></title>
<price><xsl:value-of select="price"/></price>
</book>
</xsl:for-each>
</library>
</xsl:template>
</xsl:stylesheet>
実行:
xsltproc -o programming_books.xml filter_programming.xsl books.xml
出力:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>入門Python</title>
<price>2800</price>
</book>
<book>
<title>JavaScript入門</title>
<price>3200</price>
</book>
</library>
条件に合うデータだけを抽出できました。
例4:複数ファイルの一括変換
シェルスクリプトで自動化:
#!/bin/bash
# XMLファイルが入っているディレクトリ
INPUT_DIR="xml_files"
OUTPUT_DIR="html_files"
STYLESHEET="convert.xsl"
# 出力ディレクトリを作成
mkdir -p "$OUTPUT_DIR"
# すべてのXMLファイルを変換
for xml_file in "$INPUT_DIR"/*.xml; do
# ファイル名から拡張子を除いた部分を取得
basename=$(basename "$xml_file" .xml)
# 変換実行
echo "変換中: $xml_file -> $OUTPUT_DIR/$basename.html"
xsltproc -o "$OUTPUT_DIR/$basename.html" "$STYLESHEET" "$xml_file"
done
echo "変換完了!"
実行:
chmod +x convert_all.sh
./convert_all.sh
複数のXMLファイルを一気に変換できます。
XPath式の活用
XPathとは
XPathは、XML文書内の特定の要素を指定するための言語です。
XSLTでは、XPathを使ってデータを選択します。
基本的なXPath式
要素の選択:
<!-- すべてのbookを選択 -->
<xsl:for-each select="library/book">
<!-- タイトルを選択 -->
<xsl:value-of select="title"/>
属性の選択:
<!-- id属性を選択 -->
<xsl:value-of select="@id"/>
条件による選択:
<!-- 価格が3000円以上の本 -->
<xsl:for-each select="library/book[price >= 3000]">
<!-- カテゴリが"プログラミング"の本 -->
<xsl:for-each select="library/book[category='プログラミング']">
位置による選択:
<!-- 最初の本 -->
<xsl:value-of select="library/book[1]/title"/>
<!-- 最後の本 -->
<xsl:value-of select="library/book[last()]/title"/>
子孫要素の選択:
<!-- libraryの下のすべてのtitle(どの階層でも) -->
<xsl:for-each select="//title">
トラブルシューティング
エラー1:parser error
症状:
xmlParseEntityRef: no name
parser error : Input is not proper UTF-8
原因:
XMLファイルの文字エンコーディングが正しくない。
解決策:
文字コードを確認:
file -i input.xml
UTF-8に変換:
iconv -f SHIFT-JIS -t UTF-8 input.xml > input_utf8.xml
エラー2:compilation error
症状:
compilation error: file style.xsl element for-each
xsl:for-each : could not compile select expression 'library/book'
原因:
XPath式が間違っている、または名前空間の問題。
解決策:
XPath式を確認:
XMLの実際の構造と一致しているか確認します。
名前空間の対応:
<!-- XMLに名前空間がある場合 -->
<library xmlns="http://example.com/library">
<!-- XSLTで名前空間を宣言 -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:lib="http://example.com/library">
<xsl:for-each select="lib:library/lib:book">
エラー3:I/O error
症状:
I/O error : Attempt to load network entity
原因:
外部DTDやスキーマへのネットワークアクセスが発生している。
解決策:
–nonetオプションを使用:
xsltproc --nonet style.xsl input.xml
–novalidで検証を無効化:
xsltproc --novalid --nonet style.xsl input.xml
エラー4:runtime error
症状:
runtime error: file style.xsl element value-of
xsl:value-of : could not evaluate select expression 'title'
原因:
現在のコンテキストに指定された要素が存在しない。
解決策:
存在確認を追加:
<xsl:if test="title">
<xsl:value-of select="title"/>
</xsl:if>
デフォルト値を設定:
<xsl:choose>
<xsl:when test="title">
<xsl:value-of select="title"/>
</xsl:when>
<xsl:otherwise>
タイトルなし
</xsl:otherwise>
</xsl:choose>
エラー5:output is empty
症状:
出力ファイルが空になる。
原因:
XPathが要素にマッチしていない。
解決策:
デバッグ出力を追加:
<xsl:template match="/">
<!-- デバッグ:ルート要素を表示 -->
<xsl:message>
Root element: <xsl:value-of select="name(*)"/>
</xsl:message>
<!-- デバッグ:要素の数を表示 -->
<xsl:message>
Number of books: <xsl:value-of select="count(library/book)"/>
</xsl:message>
<!-- 以下、通常の処理 -->
</xsl:template>
-vオプションで詳細表示:
xsltproc -v style.xsl input.xml
高度な使用例
カスタム関数の使用(EXSLT)
EXSLTは、XSLTの拡張機能です。
日付の書式変換:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:template match="/">
<html>
<body>
<!-- 現在の日付を表示 -->
<p>
今日は:<xsl:value-of select="date:date()"/>
</p>
<!-- 日付の書式変更 -->
<p>
年:<xsl:value-of select="date:year()"/>
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
変数とテンプレート
変数の定義と使用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- グローバル変数 -->
<xsl:variable name="tax_rate" select="0.1"/>
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="products/product">
<xsl:variable name="subtotal" select="price"/>
<xsl:variable name="tax" select="$subtotal * $tax_rate"/>
<xsl:variable name="total" select="$subtotal + $tax"/>
<p>
<xsl:value-of select="name"/>:
<xsl:value-of select="$total"/>円(税込)
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
再帰テンプレート
繰り返し処理:
<xsl:template name="repeat">
<xsl:param name="count"/>
<xsl:if test="$count > 0">
★
<xsl:call-template name="repeat">
<xsl:with-param name="count" select="$count - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- 使用 -->
<xsl:call-template name="repeat">
<xsl:with-param name="count" select="5"/>
</xsl:call-template>
<!-- 出力:★★★★★ -->
パフォーマンスの最適化
大きなファイルの処理
ストリーミング処理:
xsltprocは、ファイル全体をメモリに読み込むため、巨大なファイルではメモリ不足になる可能性があります。
対策:
ファイルを分割:
# XMLファイルを複数に分割
split -l 1000 large.xml part_
# 各ファイルを変換
for file in part_*; do
xsltproc -o "${file}.html" style.xsl "$file"
done
SAXパーサーを使う:
別のツール(saxonなど)を検討します。
キャッシュの活用
複数回実行する場合:
XSLTスタイルシートのコンパイル結果をキャッシュする仕組みはないので、スクリプト側で工夫します。
#!/bin/bash
# スタイルシートの検証(最初に1回だけ)
xmllint --noout style.xsl || exit 1
# 実際の変換
for xml in *.xml; do
xsltproc -o "${xml%.xml}.html" style.xsl "$xml"
done
よくある質問
Q1: xsltprocとsaxonの違いは?
A:
xsltproc:
- XSLT 1.0のみ対応
- 軽量で高速
- コマンドラインツール
- 無料
Saxon:
- XSLT 2.0/3.0対応
- より高機能
- JavaベースまたはC++版
- 商用版と無料版がある
シンプルな変換ならxsltproc、高度な機能が必要ならSaxonがおすすめです。
Q2: XSLT 2.0は使えない?
A: xsltprocはXSLT 1.0のみ対応です。
XSLT 2.0/3.0が必要な場合は、Saxon、Xalan、またはlibxml2を直接使う必要があります。
Q3: 名前空間の扱いが難しい
A: 名前空間は、XSLTで明示的に宣言する必要があります。
<!-- XMLに名前空間がある -->
<root xmlns="http://example.com/ns">
<!-- XSLTで対応 -->
<xsl:stylesheet xmlns:xsl="..."
xmlns:ex="http://example.com/ns">
<xsl:for-each select="ex:root/ex:item">
プレフィックス(ex:)は任意ですが、URIは完全一致が必要です。
Q4: 日本語が文字化けする
A: エンコーディングの指定を確認してください。
XMLファイル:
<?xml version="1.0" encoding="UTF-8"?>
XSLTファイル:
<xsl:output method="html" encoding="UTF-8"/>
すべてUTF-8に統一するのが確実です。
Q5: HTMLの特殊文字が正しく出力されない
A: xsl:outputの設定を確認してください。
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
method="html"を指定すると、HTMLエンティティ(&、<など)が正しく処理されます。
まとめ
xsltprocは、XSLTスタイルシートを使ってXMLデータを様々な形式に変換できる、シンプルで強力なコマンドラインツールです。
この記事のポイント:
- xsltprocはXMLをXSLTで変換するツール
- Linux/Unix環境で標準的に使用される
- XMLからHTML、CSV、別のXMLなど様々に変換可能
- 基本コマンドは
xsltproc style.xsl input.xml -oオプションでファイルに出力- XPathで要素を柔軟に選択
- パラメータで動的な変換が可能
- RSSフィード、商品データなど実用例が豊富
- 大きなファイルはメモリに注意
- XSLT 1.0のみ対応(2.0/3.0は不可)
- 文字コードはUTF-8に統一が安全
XMLデータの変換は、最初は難しく感じるかもしれません。でも、基本的なXSLTの構造を理解すれば、データを自由自在に加工できるようになります。
まずは簡単な例から始めて、徐々に複雑な変換に挑戦してみてください。XMLとXSLTの組み合わせは、データ処理の強力な武器になりますよ。
WebサイトのRSSフィード表示、商品データのCSV変換、設定ファイルの自動生成など、様々な場面で活躍してくれるはずです。
xsltprocをマスターして、効率的なデータ変換処理を実現していきましょう!


コメント