XSL Formatting Objects

概要

XSL-FO文書も、（XSLTにより） XSL-FO形式に変換する前の文書も、ともにXMLに準拠したマークアップ言語である。このことは、XHTML/HTML と CSS を組み合わせて使う場合とは対照的である。XHTML/HTML は XML/SGML に準拠しているが、CSS は独自の構文で記述する言語でありXMLに準拠していない。
XSL-FOでは、XHTMLとは異なり、意味に基づいたマークアップは行わず、組版で必要となるマークアップのみを行う。また、XSL-FO文書自身に組版の対象となる文書データが全て格納される。一方で CSS は、別の XML もしくは XHTML 文書の既定の表現を変更する方法を採っている。
視覚的表現のための他の手段には、XHTML、DocBook および TEI などの利用がある。XSL は、XSLT が任意の XML を処理可能であるため、どのような XML 文書に対しても適用できる。また出力手段も XSL-FO に限らず、XSLT によって XHTML などに変換する（XMLベースであればなんでも）、といったことも可能である。
XSL では、まずXSLTスタイルシートを使うことが多い。このXSLTスタイルシートは対象となるXML文書の文書型 （スキーマ） にあわせて記述される。XSLTスタイルシートは、組版を行う人自身が記述する場合もあるが、文書型にあわせて作成された既製のものを使うこともできる。このXSLTスタイルシートを適用することにより、対象となるXML文書は、XSL-FO文書に変換される。
XSL-FOでは、XML文書の一般的な作成者は、普通のXML文書を作成するのであり、直接にXSL-FO形式のXML文書を作成することは、想定していない。XSL-FOでは、XML文書の作成者が作成したXML文書をXSLTを使ってXSL-FO形式のXML文書に変換すると、想定している。XSLTのスタイルシートは、作成したXML文書とは別途作成する場合と、XML文書自身に埋め込む場合がある。XSL-FO文書の生成は、XSLTによる変換によって行うことができるが、適切なXSL-FO形式に生成できるのであれば、XSLTを使わずに任意の手段で生成して構わない。
XSLTは、当初はXSL-FOへの変換という用途のみが想定されていたが、XML文書の汎用的な変換に使用可能である。現時点では、多くのソフトウェア技術者（プログラマ）はXSLTをXML文書の汎用的な変換言語として認識しており（認識の問題ではなく、汎用であるということは単なる事実であるが）、XML文書をXSL-FO文書に変換するという用途はあまり認識されていない。
XSLTの変換は非常に強力である（チューリング完全である）。XSLTを使うことによって自動的に、文書の目次を生成したり、参考文献とのリンクを設定したり、索引を生成するなど、非常に多様な能力をもつ。
XSL-FO形式の文書が生成されると、XSL-FOの処理系がそのXSL-FO文書を処理して組版する。XSL-FO処理系は、XSL-FO文書を入力として、一般の人々にとって読みやすいファイル形式ないしは印刷/表示可能な媒体を、出力する。出力可能な形式の種類は、XSL-FO処理系の実装により異なる。現在、XSL-FOで最も一般的な出力形式はPDFである。実装によっては、PostScriptやRTFなどの他の形式での出力も可能であるし、ファイルを作成せずに直接にコンピュータ画面に表示したり、直接印刷することもできる。

XSL-FOの基本的な考え方

XSL-FOは、複数のページで構成される媒体を想定して設計された。一方HTMLとCSSは、ページの概念が無い媒体 （コンピュータ画面など） を想定して設計されている。XSL-FOにおいてページの概念は不可欠な要素である。XMLを扱う人々にとって、XSL-FOの処理系は、複数のページで情報を表示する際には強力なツールである。
XSL-FOの基本的な考え方は、コンピュータによる組版である。XSL-FO文書には、印刷対象となる文書データと文書データに対する組版の制約情報が含まれている。このXSL-FOをもとに、XSL-FO処理系は組版を行う。XSL-FOはこうした仕組みに基づいているため、あるXSL-FO処理系による出力と、別のXSL-FO処理系による出力が、一致しないことがある。しかしXSL-FOの一般的な目的は、複数のページで構成された組版された媒体を生成することであるため、あまり問題にはならない。XSL-FOの使い方としては、紙などに印刷された文書やPDFファイルの生成が、一般的である （PDFファイルもその性質は印刷された文書に近い） 。
XSL-FOは、「内容駆動」(content-driven) と呼ばれる設計による組版に非常に適している。この組版の設計は、書籍や論文、法的文書などで標準的な方法である。この組版設計は、一つの連なったテキストに対応する単一の流し込み （フロー） 領域をもち、ページの余白にさまざまな情報を配置することができる。この設計は、「割り付け駆動」(layout-driven) の設計とは、対義的な設計方法である。割り付け駆動の組版の設計方法は、新聞や雑誌などで使われている。割り付け駆動の設計では、ある文書内容に必要な空間を充分に確保できなかった場合、割り付けを調整して充分に確保しない限り、文書内容は途中までしか印字できない。XSL-FOでは、新聞や雑誌におけるこのような窮屈な制約を制御することは、簡単なことではない。実際にXSL-FOでは、多くの場合、先述のような割り付けの形式を表現する機能がいくつか欠如している。
XSL-FOは基本的にこのように設計されているが、非常に豊富な表現力をもつ。表、リスト、側浮動体 （本文とは分離した領域） 、その他さまざまな機能を備えており使うことができる。XSL-FOのこうした多くの機能はCSSの組版機能と互換性がある。

XSL-FOの機能

XSL-FOには非常に多くの機能がある。
先に述べたことに加え、XSL-FOでは次のような機能を仕様で規定している。

段組

複数の段数で段組のページを記述することができる。
段組のページを記述する場合、既定ではブロックはある段から次の段へと流し込まれる。
あるブロックを全ての段をまたがって配置することができる。
その場合はページ中に本文の区切りを入れる。
この区切りより前の本文は、この区切りより前方の各段に順に流し込まれる。
区切りより後の本文についても、区切りより後方の各段に順に流し込まれる。
ただしこの場合は区切りをまたがって、区切りの前の部分から区切りの後の部分にかけて、文章を流し込むことはできない。
段組で記述されたページでも、XSL-FOの全ての機能は有効である。

ページ付け制御

XSL-FOでは、ブロックあるいはフロー自体に対して、段落の途中で改ページを行うことになった場合、前のページに最低限残すべき行数と、後のページに最低限印字すべき行数を指定することができる。
この指定は、そのブロックが子ブロックを含む場合は継承される。
また、ブロック全体を分割せずに1ページ内に収めるよう、指定することもできる。
例えば、画像のブロックとその画像の説明文が、別々のページに分割されることは望ましくない。
XSL-FO処理系は、例えページ中に大きな空白部分を作ることになっても、これらの指定に従うように努める。

表

XSL-FOの表は、HTML/CSSの表 （テーブル） と非常によく似ている。
表の各データを、各々の枠内に配置することができる。
また、表の各々の列に対して背景色などのスタイル情報を指定することができる。
表の最初の行を、見出し行として指定することができ、見出し行に対しては他の行とは異なる固有のスタイル情報を指定することができる。
XSL-FO処理系は、各列の幅の長さを厳密に計算して組版することができる。
あるいは、表内にうまく収まるように枠内のテキストを調整して組版することもできる。

XSL-FO文書の例

XSL-FO文書の例を示す。
この例では、A4サイズのページに "Hello world!" を印字する。
<?xml version="1.0"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <fo:layout-master-set>
  <fo:simple-page-master master-name="A4" page-width="210mm" page-height="297mm">
   <fo:region-body region-name="xsl-region-body" margin="2cm"/>
  </fo:simple-page-master>
 </fo:layout-master-set>
 <fo:page-sequence master-reference="A4">
  <fo:flow flow-name="xsl-region-body">
   <fo:block>Hello world!</fo:block>
  </fo:flow>
 </fo:page-sequence></fo:root>

XSL-FOの特長

XSL-FO文書はXMLに準拠した文書であるため、適切なXSLTスタイルシートを用意してXSLT処理系を適用すれば、どのような文書型のXML文書でも、XSL-FO文書を生成することができる。
そのためXSLTスタイルシートとXSLT処理系を使えば、XMLに準拠したTEI文書やDocBook文書をもとにして、ウェブで閲覧できるXHTML文書を生成することは容易に実現できる （この場合はXSL-FO文書を生成する必要は無い） し、さらにXSL-FO処理系を使えば印刷向けのPDF文書を生成することができる。
実際に、既存のTEI文書やDocBook文書の多くが、XSLT/XSL-FOにより、XHTMLやPDFなど人間にとって理解しやすい形式に変換されてきた。
またXSL-FO文書はXMLに準拠しているが、明示的なスキーマやDTDが定義されていないため、XSL-FO文書にはXML形式の何らかのデータを格納することができる。
このようなXML形式のデータとして最もよく使われるのは、おそらく画像形式であるSVGであろう。
多くのXSL-FO処理系が、SVGデータが埋め込まれたXSL-FO文書を解釈し、SVGの画像データを埋め込んだ出力を生成することができる。
XSL-FOのもう一つの特長は、そこそこ使いやすいことが挙げられる。
XSL-FOの非常に多くの機能は、CSSに基づいている。
そのためCSSを使ってきた人々にとっては、XSL-FOのマークアップ属性などはなじみやすい。
あるXSL-FO文書の特定の部分を見てその部分がどのように組版されるかを認識することは、多くの場合は簡単である。
このXSL-FOの特長は、TeXのような組版ソフトウェアパッケージの場合と比べると際立っている。
TeXのソース文書を見てどのように組版されるかを認識することは、TeXをよく使う人でなければ一般的には難しい。

XSL-FOの課題

XSL-FOの課題の一つは、2006年12月現在ではXSL-FO処理機能を備えたソフトウェア （XSL-FOの処理系） が少ないことである。
また、XSL-FO 1.0 の公式仕様では非常に多くの機能が規定されており、そのため仕様に100%準拠した処理系は実際には存在しない。
XSL-FO処理系が少ない理由は、現時点ではXSL-FOに対する需要があまり多くないからであるとの見解がある。
TeXとそのマクロパッケージ群 （LaTeXなど） は、組版向け言語として既に長い間その地位を確立している。
そしてTeXを使う人々は、TeXに替えてXSL-FOを採用する必要性をほとんど感じていない。
もう一つの課題は、XSL-FO文書を読んで内容を理解することは簡単であるが、XSL-FO文書を手作業などで記述することは、難しいことであり非常に冗長な作業となることである。
XSLTは、XSL-FO文書を簡単に生成することができるように設計された。
そのためXSL-FO自体には、XSL-FOを簡潔な作業で生成するという観点は考慮されていない （XSLTを使えば簡潔な作業で生成できる） 。
この問題は別の問題を提起する。
XSL-FOの初学者は、XSL-FO文書を記述する方法を一通り学ぶだけでなく、場合によってはXSLTによる変換の方法も学ばなければならないということになる。
このことは当然ながら、標準化されたXML文書を変換する既製のXSLTスタイルシートが使える場合は、問題とはならない。

XSL-FOのバージョン

2006年12月現在、XSLの最新バージョンは1.1である。XSLが2001年10月に勧告になってからいくつかのXSL-FO処理系が登場したが、XSL-FO V1.0の勧告では、ユーザが望む機能が不足していたため、処理系それぞれが独自拡張を行って機能を追加してしまった。このため、W3CのXSL ワーキンググループでは、処理系の実装を調査して共通の機能を標準化することを優先的に行ってきた。その作業成果がXSL-FO V1.1であり、V1.1で標準化されたそれらの機能には、巻末索引、改訂バー、PDFにおけるしおり、財務諸表における部分和への対応などに必要となる表中における条件付テキスト指標、ページグループ内での最終ページ番号の検出、単一ページ内での複数方向への記述、がある。