レベル: 中級 William von Hagen, Systems Administrator, Writer, WordSmiths
2009年 3月 24日 更新 2009年 7月 07日 XML は、あらゆる構造化データ・セットに含まれるデータ項目とサブコンポーネントを識別する手段となりますが、XML の根本は文書を作成してその出力を生成するところにあります。XML 文書マークアップのための明確なオープン・スタンダード、そして XML 文書の構文解析およびフォーマット変換に使用できる無料のツールの数々のおかげで、文書の作成とフォーマット設定用の完全な環境を UNIX® や Linux® システムに簡単にインストールして構成することができます。
XML、マークアップ、そして文書化
XML は、データ・セット内の構造化されたコンテンツを識別するためのメカニズムとして設計されました。コンテンツを識別する方法は、階層内でのテキストを区切った上でそのそれぞれの役割を識別するテキスト・タグを使って、データを構成するそれぞれの階層部分を囲むというものです。マークアップ、タグ、あるいはそれよりも厳密には要素として知られるテキスト・タグは、事前に定義された構造に従います。その構造はデータの種類それぞれに固有であり、スキーマ、あるいは従来からの呼び方では DTD として知られています。スキーマは XML で作成される一方、DTD には専用の構文があります。
 |
よく使われる頭字語
- DTD: Document Type Definition
- HTML: Hypertext Markup Language
- XHTML: Extensible Hypertext Markup Language
- XML: Extensible Markup Language
- XSL: Extensible Stylesheet Language
|
|
マークアップ言語の概念、すなわち XML そのものの概念は、文書作成システムに由来します。文書作成システムでは、文書の異なる部分に対する処理命令または構造上の ID をテキスト・ファイルに含め、そのテキスト・ファイルをソフトウェアで処理します。このソフトウェアは処理命令を解釈することができるとともに、特定の出力デバイス用にフォーマット設定した出力を生成することができるものです。文書の作成に対応するマークアップ言語の進化によって、マークアップの使用方法がより抽象化されたものになっています。
初期のマークアップ言語では、フォントやフォント・サイズの変更といった下位レベルの詳細を指定するフォーマット命令を使用していました。これらの指定は瞬く間に進化し、強調表示する言葉や、パラグラフ、リスト、見出しなどの論理コンポーネントや構造上のコンポーネントを識別する汎用マークアップとなりました。
最近のマークアップ言語では、SGML (Standard Generalized Markup Language) や XML などのように、book、chapter、section などといった一層抽象的な構造上のマークアップが普及するようになりました。SGML には DTD の概念も含まれており、SGML ツールはこの概念を利用することで特定のマークアップ要素セットへの適合性を検証したり、これらの要素を特定タイプの文書構造内で使用するためのコンテキストを検証したりできるようになりました。
XML はマークアップを文書の作成だけに限らず、あらゆるタイプの構造化データにまで適用できるようにしたマークアップ言語です。さらに XML は、各要素には開始タグと終了タグの両方が必要であるという、整形式コンテンツの要件も追加しました。XML 仕様の初期バージョンでは SGML からの DTD を引き継いでいましたが、その後のバージョンでは、XML データの構造を定義するスキーマの使用を導入しています。スキーマは DTD に相当するものですが、それ自体が XML で作成されており、有効な要素とそのデータ型、そして XML 文書内でこれらの要素を使用するためのコンテキスト、などを定義するための柔軟なモデルを提供します。
現代のマークアップ言語を支える重要な鍵となっているのは、文書の内容 (コンテンツ: 文書に含まれる実際の語句やデータ) を表示 (プレゼンテーション: 特定の出力フォーマットや、特定の出力デバイスで表示する方法) とは切り離すという考えです。この考えは、SGML と XML では特に強調されています。
XML では、特定のアプリケーションや業界に向けた DTD とスキーマを簡単に考案できますが、文書の作成という点で考えると、文書作成用マークアップに多数の標準 DTD およびスキーマを使用できることがその最大のメリットとなります。そのうち最もよく知られているのは、DocBook、TEI (Text Encoding Initiative)、XHTML、そして DITA (Darwin Information Typing Architecture) で使用されているスキーマと DTD です。この記事では、知名度が高く、文書作成用マークアップとして最も広く使用されているスキーマ、DocBook に焦点を当てます。
XML 文書のパブリッシング・プロセスについての概要
コンテンツをプレゼンテーションから切り離すことを重点とする XML は、本質的に「書き込みは 1 回限りで、読み取りは何度もできる」メカニズムで、その目的は、複数の文書で情報を再利用しやすくすること、あるいは特定の出力フォーマットや対象読者に合わせて情報をカスタマイズしやすくすることです。XML での情報の再利用とカスタマイズについては、この連載の他の記事で掘り下げて説明します。
この記事で使用する「パブリッシング」の意味は、DocBook マークアップが含まれるテキスト・ファイルを、特定の表示フォーマット、例えば HTML、Adobe® の PDF (Portable Document Format)、PostScript、Microsoft® の RTF (Rich Text Format) などの出力ファイルに変換することです。XML 文書から HTML 出力を生成するプロセスは、単一のアプリケーションを使用して HTML 出力を生成するというシングル・ステップのプロセスです。PDF、PostScript または RTF 出力を生成するプロセスには、以下のように、2 つのステップが必要になります。
- DocBook 文書に含まれるすべてのインクルード・ファイルまたは外部参照を解決し、XSL スタイルシートを使用してこの文書の FO (Formatting Object) フォーマット・バージョンを生成します。
- PDF、PostScript または RTF で出力する場合には、FO バージョンの DocBook 文書を指定フォーマットの出力ファイルに変換します。
フォーマット変換に使用できるオープンソースのツールはさまざまにありますが、この記事では私が最も便利で最も柔軟なソリューションだと判断した 3 つのツールに焦点を絞ります。表 1 に、この 3 つのツールについて説明します。
表 1. この記事で使用するオープンソースの変換ツール
| ツール | 説明 |
|---|
fop | XML 入力を PDF、PostScript、RTF などの出力フォーマットに変換する Java™ アプリケーション。このアプリケーションを実行するには、システムに Java 仮想マシン (JVM) をインストールする必要があります。 | xmlto | XML 入力から HTML 出力を生成する単純な Bourne-Again シェル・スクリプトと関連スタイルシートのセット。このスクリプトには、GNU の find や mktemp など、他のオープンソースのユーティリティーがいくつか必要になります。 | xsltproc | XSL スタイルシートを使用して XML 入力を別の XML 出力フォーマットに変換するためにコンパイルされたアプリケーション。このツールで変換を行うには、DocBook XSL スタイルシートもインストールする必要があります。fop が DocBook XML 入力を受け入れるには、適切なスタイルシートが指定されていることが条件となりますが、xsltproc のようなスタンドアロンの XML/FO コンバーターを使用すると、DocBook 入力ファイルに問題がある場合のデバッグが単純化されます。 |
以降のセクションでは、上記のアプリケーションをダウンロードしてインストールする方法について説明した後、このすべてのアプリケーションを統合するシェル・スクリプトを紹介し、出力フォーマットやカスタム・スタイルシートなどを指定する際に役立つオプションを紹介します。
必要なソフトウェアを入手してインストールする
前のセクションで説明したソフトウェアとスタイルシートを提供するパッケージの取得先については、「参考文献」を参照してください。
注: Linux システムをご使用の場合、xmlto および xsltproc ユーティリティーがすでにシステムにインストールされている可能性が大いにあります。インストールされていないとしても、これらのユーティリティーはディストリビューションのリポジトリーまたはインストール・メディアから入手することができます。また、fop を実行する実際の JVM もインストールしてください。GNU Compiler for Java は、fop に必要なすべての機能を提供するわけではありません。
これらのパッケージの多くは、システムのパッケージ管理ソフトウェアがソフトウェアをモニターして必要に応じて更新できるように、ソフトウェアを特定の場所にインストールします。ただし、DocBook XSL スタイルシートと Apache FOP (Formatting Objects Processor) は別で、この 2 つは単一の最上位ディレクトリーとその配下の各種サブディレクトリーが含まれる形のアーカイブ・ファイルとしてダウンロードしますが、インストール・ディレクトリーが決められているわけではありません。
文書の構文解析とフォーマット設定の環境を統一するには、新たなディレクトリー (/home/doc など) を 1 つ作成し、パス名が固定されていないパッケージはすべてそこにインストールするのが得策です。このようにすれば、その 1 箇所で、関連ファイルを検索し、必要に応じてソフトウェアをアップグレードすることができ、ツールやスタイルシートを開発したり少しずつ集めたりした場合にも、そこに配置することができます。
前のセクションで説明したパッケージを統合スクリプト (次のセクションに記載) と連動させるため、UNIX または Linux システムで root ユーザーとしてリスト 1 のコマンドを実行してください。
リスト 1. fop、xmlto、および xsltproc を統合スクリプトと連動させるために実行するコマンド
mkdir /home/doc
mkdir /home/doc/bin
mkdir /home/doc/external
mkdir /home/doc/external/SAVE
mkdir /home/doc/XSL
|
FOP の圧縮ファイル (.zip) と DocBook XSL スタイルシートをダウンロードし、/home/doc/external ディレクトリーに配置した上で、このディレクトリーに移り、リスト 2 のコマンドを実行してそれぞれのコンテンツを抽出してください。
リスト 2. FOP および DocBook XSL スタイルシートを抽出するコマンド
cd /home/doc/external
unzip fop-0.95-bin.zip
unzip docbook-xsl-1.74.3.zip
chmod 755 fop-0.95/fop
|
必要なすべてのパッケージがシステムにインストールされた状態になっていることを確認するには、リスト 3 のコマンドを実行します。
リスト 3. 必要なすべてのパッケージがインストールされたことを確認するコマンド
xmlto --version
xsltproc --version
java --version
|
xmlto および xsltproc アプリケーション、そして JVM が正しくシステムにインストールされ、実行パスに組み込まれていれば、各コマンドが、該当するアプリケーションのバージョン情報を返します。
文書をパブリッシュするためのラッパー・スクリプトを作成する
DocBook のパブリッシングに欠かせないソフトウェアをすべてシステムにインストールしたら、後は必要なすべてのオプションを覚えて、正しい順序で作業を行うだけです。あるいは、要素を正しく結び付け、パブリッシュ・プロセスを制御する単純なラッパー・スクリプトを作成するという方法もあります。例えば、リスト 4、リスト 5、リスト 6 に記載するようなラッパー・スクリプトです。
このスクリプトは、指定された引数に基づいて HTML、PDF、または RTF 出力を生成します。PDF 出力または RTF 出力を生成するときには、2 ステップのプロセスが使用されます。最初のステップでは、ラッパー・スクリプトが変換ルールを特定するための (driverfile 変数の値として特定される) XSL スタイルシートを使って xsltproc を実行し、DocBook 入力から FO ファイルを生成します。そして次のステップでは fop アプリケーションを使用して、生成した FO ファイルからターゲットの出力フォーマットを生成します。それぞれのステップでは、使用されているアプリケーション (xsltproc および fop) からのメッセージが xsltproc.out ファイル、fop.outファイルに取り込まれます。スクリプトはこれらの中間ファイルを使用して変換プロセスをモニターし、問題が発生した場合には潜在的デバッグ情報を収集します。
リスト 4 に、サンプル・ラッパー・スクリプトの冒頭の部分を記載します。この部分では、引数を指定しないでスクリプトを実行した場合や、誤った数の引数でスクリプトを実行した場合に表示される使用方法に関するメッセージを定義しています。さらに、スクリプトのデフォルト値のいくつかを設定した後、標準 Bash シェルの getopt 関数を使ってコマンドライン引数を解析しています (リスト 7 に、この使用方法に関するメッセージの出力を記載しています)。
リスト 4. 単純なラッパー・スクリプトの初期化セクション
#! /bin/bash
#
# Simple script to generate HTML output from a DocBook file using
# xmlto, or to generate PDF/RTF output by generating a fo file,
# and then using Apache's FOP to format that.
#
# wvh@vonhagen.org
#
function usage {
echo "Usage: $0 [OPTIONS] document-name"
echo " -D : produce draft mode document"
echo " -d : use specified xsl driver (requires name of XSL file) "
echo " -h : generate HTML output (requires output directory name)"
echo " -k : attempt PDF generation even if xsltproc errors were encountered"
echo " -n : suppress TOC"
echo " -r : produce RTF output rather than PDF"
exit 1
}
dir=`dirname $0`
XSLTPROC="xsltproc"
PATH=$dir/../external/fop-0.95:${PATH}
if [ $# == 0 ] ; then
usage
exit
fi
driverfile="$dir/../external/docbook-xsl-1.74.3/fo/docbook.xsl"
# driverfile="$dir/../XSL/generic-print-driver.xsl"
draft="no"
keepgoing="no"
RTFoutput="no"
HTMLoutput="no"
while getopts ":d:h:Dknr" opt
do
case $opt in
d )
driverfile=$OPTARG
echo "Using driver file: $driverfile"
if [ ! -f $driverfile ] ; then
echo " Driver file not found"
exit 1
fi
;;
D )
draft="yes"
echo "Producing Draft Mode Document"
;;
h )
HTMLdir=$OPTARG
HTMLoutput="yes"
echo "Producing HTML output to $HTMLdir instead of PDF"
if [ -d $HTMLdir ] ; then
echo " Output directory $HTMLdir already exists"
exit 1
fi
;;
k )
keepgoing="yes"
echo "Will not stop if errors are encountered"
;;
n )
notoc="--stringparam generate.toc ''"
echo "Suppressing TOC..."
;;
r )
RTFoutput="yes"
echo "Producing RTF output rather than PDF"
;;
\? )
usage
exit 1;;
esac
done
shift $(($OPTIND - 1))
if [ ! -f $1 ] ; then
echo " Input file $1 not found - exiting."
exit
fi
|
リスト 5 に記載するスクリプトの部分は、HTML 出力を生成する場合には xmlto アプリケーションによって入力 XML ファイルから HTML を生成し、PDF または RTF 出力を生成する場合には xsltproc アプリケーションによって FO 出力を作成します。XML から FO への変換ステップで生成される出力は、xsltproc.out という一時ファイルに書き込まれます。このファイルにより、xsltproc アプリケーションが入力ファイルの中にエラーを検出した場合のデバッグが容易になります。このファイルに何らかのエラーのようなものが検出されると、スクリプトは FO ファイルを生成した後に終了します。そのような場合に問題を識別して解決する糸口となるのが、xsltproc.out ファイルです。リスト 4 の場合と同じく、xsltproc の処理中にエラーが検出されてもスクリプトを続行させるには、-k コマンドライン・オプションを指定してください。
リスト 5. 入力 XML ファイルからの FO 出力の生成
doc_base=`basename $1 .xml`
echo "Processing base name: $doc_base"
if [ x$HTMLoutput != "xno" ] ; then
xmlto -o $HTMLdir html $1
exit
fi
echo " Generating FO file: $doc_base.fo"
$XSLTPROC --output $doc_base".fo" \
--stringparam draft.mode $draft \
--stringparam fop1.extensions 1 \
--xinclude \
$notoc \
$driverfile \
$1 1> xsltproc.out 2> xsltproc.out
probs=`grep -i error xsltproc.out | wc -l | sed -e 's; ;;g'`
if [ x$probs != "x0" ] ; then
echo ""
echo "PROBLEMS:"
echo ""
cat xsltproc.out
echo ""
if [ x$keepgoing = "xno" ] ; then
exit
fi
fi
echo " Fixing FO file references to system images..."
cat $doc_base".fo" | sed -e "s;\"url(\.\./external/;\"url($dir/\.\./external/;g" > $$
mv $$ $doc_base".fo"
|
リスト 6 にスクリプトの最終段階を記載します。ここでは、fop アプリケーションを使用して FO ファイルから PDF 出力または RTF 出力を生成します。XML から FO への変換プロセスと同じく、FO から PDF/RTF に変換するステップで生成される出力は fop.out という名前の一時ファイルに書き込まれるため、fop アプリケーションが FO ファイルでエラーを検出した場合に簡単にデバッグできるようになっています。PDF/RTF の生成に失敗したら、この fop.out ファイルを調べて、問題を識別して解決してください。ここでもリスト 4 の場合と同じく、-k コマンドライン・オプションを指定して、xsltproc の処理中にエラーが検出されてもスクリプトを強制的に続行させることが可能です。
リスト 6. FO ファイルからの PDF または RTF 出力の生成
if [ x$RTFoutput = "xno" ] ; then
echo " Generating PDF file: $doc_base"".pdf"
fop -fo $doc_base".fo" -pdf $doc_base".pdf" 1> fop.out 2> fop.out
else
echo " Generating RTF file: $doc_base"".rtf"
fop -fo $doc_base".fo" -rtf $doc_base".rtf" 1> fop.out 2> fop.out
fi
probs=`grep -i Exception fop.out | wc -l | sed -e 's; ;;g'`
if [ x$probs != "x0" ] ; then
echo ""
echo "EXCEPTION OCCURRED DURING PROCESSING:"
echo ""
cat fop.out
echo ""
fi
|
このサンプル・スクリプトのコピー、xml-format.sh はダウンロードすることができます (「ダウンロード」セクションの xml-format.zip を参照)。スクリプトをシステムにインストールするには、この zip ファイルをダウンロードして xml-format.sh を home/doc/bin ディレクトリーに解凍してください。スクリプトが実行可能であることを確認するには、以下のコマンドを実行します。
chmod 755 /home/doc/bin/xml-format.sh
|
最後に、/home/doc/bin ディレクトリーが実行パスに確実に含まれているようにするため、~/.bashrc ファイルを編集して以下の行をファイルの最後に追加するか、あるいはシステムのシェル・プロンプトで、これと同じ行をコマンドとして実行します。
export PATH=/home/doc/bin:${PATH}
|
上記のコマンドを ~/.bashrc ファイルに追加した場合、現行のシェルに変更を適用するには、このファイルを現行ログイン・セッションのソースとして指定する必要があります。それには、以下のコマンドを実行します。
DocBook 文書をパブリッシュする
引数を指定せずに xml-format.sh スクリプトを実行すると、スクリプトの使用方法に関する要約情報が表示されます (リスト 7 を参照)。
リスト 7. 引数を指定せずに xml-format.sh スクリプトを実行した場合の出力
Usage: xml-format.sh [OPTIONS] document-name
-D : produce draft mode document
-d : use specified xsl driver (requires name of XSL file)
-h : generate HTML output (requires output directory name)
-k : attempt PDF generation even if xsltproc errors were encountered
-n : suppress TOC
-r : produce RTF output rather than PDF
|
DocBook 文書の PDF バージョンを生成するには、以下の例に示すように、その文書の名前でスクリプトを実行すればよいだけのことです。
xml-format.sh sample-document.xml
|
このスクリプトを使って DocBook 文書の HTML バージョンを生成する場合には、-h オプションを使用して、HTML 出力ファイルの宛先ディレクトリーの名前を指定します。例えば、DocBook 文書の HTML バージョンを HTML-output ディレクトリー (現行作業ディレクトリーの相対ディレクトリー) に生成するとしたら、以下のコマンドを実行することになります。
xml-format.sh -h HTML-output sample-document.xml
|
PDF 出力の場合の XSL カスタマイズ層を追加する
この記事に付属の xml-format.sh スクリプトはデフォルトで、DocBook XSL パッケージに用意されているデフォルト出力スタイルシートを使用するように設定されています。独自のカスタマイズを加えるには、デフォルトの DocBook XSL スタイルシートをロードした後に、値を変更したいパラメーターにカスタム値を指定することで、独自のスタイルシートを作成してください。カスタマイズ層の一例は、generic-print-driver.xsl スタイルシートに提供されています (「ダウンロード」セクションの generic-print-driver.zip を参照)。
xml-format.sh スクリプトで異なるスタイルシートを使用するには、使用するスタイルシートの完全パス名または相対パス名を -d オプションを使って指定するという方法、または xml-format.sh スクリプト内で driverfile 変数の値を変更するという方法のいずれかを選べます。サンプル・スクリプトには、generic-print-driver.xsl サンプル・スクリプトを使用するための行が含まれています。driverfile 変数の前にある値をコメント・アウトし、この変数の後の新しい定義が含まれる行のコメントを外すだけで、サンプル・スクリプトが有効になります。
まとめ
XML の機能と柔軟性、一連の既存の標準、そして豊富に揃った XML 文書の操作および変換ツールにより、XML 文書からさまざまなフォーマットで出力を生成する独自のツールは、簡単にインストールして構成することができます。XML 文書の編集やフォーマット設定に使用できる商用ツールも数多くありますが、独自のツール・セットを作成すれば、プロセスをより深く理解できるようになります。そこには、何にも代えがたい価値があります。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Sample DocBook formatting script | xml-format.zip | 2KB | HTTP |
|---|
| Sample XSL customization for DocBook | generic-print-driver.zip | 1KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
- Apache FOP: ご使用のプラットフォームに対応する最新バージョンをダウンロードしてください。まずは左側にリストされた
Download をクリックします。
xsltproc: UNIX および Linux システム対応の最新バージョンをダウンロードしてください。
- DocBook DTD: 最新バージョンをダウンロードして、早速使い始めてください。
- DocBook XSL スタイルシート: 最新リリースをダウンロードしてください (DocBook Project site > file releases の順に進み、docbook-xsl を選択します)。
xmlto: ご使用のシステムにまだ用意されていない場合には、最新バージョンをダウンロードしてください。実行している UNIX または Linux のバージョンによっては、Bash、Bourne-Again シェル、GNU find ユーティリティーとその関連ユーティリティー、そして mktemp もダウンロードしてインストールする必要があります。
- IBM Java SDK: ご使用のプラットフォームに対応した開発者向けキットをダウンロードしてください。特定の UNIX および Linux ディストリビューションでは、Apache FOP フォーマッターをインストールして使用するために IBM Java SDK をダウンロードしてインストールする必要があります。
- IBM 製品の評価版: DB2®、Lotus®、Rational®、Tivoli®、および WebSphere® のアプリケーション開発ツールとミドルウェア製品を体験するには、IBM SOA Sandbox のオンライン試用版をダウンロードするか、検討してみてください。
議論するために
著者について  | |  | William von Hagen は、20 年以上の執筆活動および UNIX システム管理者としての経歴を積んでいます。1993年以来 Linux の支持者である彼は著者または共著者として、Ubuntu Linux、Xen 仮想化、GCC (GNU Compiler Collection)、SUSE Linux、Mac OS X、Linux ファイルシステム、 SGML などについての本を書いています。また、Linux および Mac OS X の出版物や Web サイトにも多数の記事を載せています。 |
記事の評価
|