33
Extensible Stylesheet Language (XSL-FO)解説 アンテナハウス株式会社 2001 4

Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

Extensible Stylesheet Language(XSL-FO)解説

アンテナハウス株式会社

2001 年 4 月

Page 2: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

Table of Contents

はじめに........................................................................................................................................4

組版プロセス概観........................................................................................................................5XML ドキュメント...............................................................................................................................................5

XSLT とは?.........................................................................................................................................................6

XSLT プロセサ......................................................................................................................................................7

XSLT スタイルシート作成法...............................................................................................................................7

XSL-FO 用 XSLT スタイルシート.......................................................................................................................7

XSL-FO ファイルの例..........................................................................................................................................8

世界の XSL-FO プロセサ ....................................................................................................................................9

組版結果の例.........................................................................................................................................................9

XSL-FO 仕様の概要 ..................................................................................................................10現状......................................................................................................................................................................10

組版プロセス.......................................................................................................................................................10

エリア・モデル...................................................................................................................................................10

リファレンス・オリエンテーション.................................................................................................................11

ライティング・モード........................................................................................................................................12

ブロックとインラインの進行方向.....................................................................................................................12

Keep と Break......................................................................................................................................................13

FO のプロパティからエリアのトレイトへ.......................................................................................................14

ショートハンド・プロパティ............................................................................................................................14

数値の表現...........................................................................................................................................................14

XSL-FO の一覧...........................................................................................................................15宣言、ページネーション、ページレイアウトの FO .......................................................................................15

ブロック・レベルの FO.....................................................................................................................................15

インラインレベルの FO.....................................................................................................................................16

表の FO................................................................................................................................................................16

リストの FO........................................................................................................................................................17

リンクとマルチ FO.............................................................................................................................................17

アウト・オフ・ラインの FO..............................................................................................................................17

その他の FO........................................................................................................................................................17

フォーマッテイング・プロパティ............................................................................................18

ページネーションの基本...........................................................................................................20XSL-FO ドキュメントの構成.............................................................................................................................20

レイアウトマスターセット................................................................................................................................21

ページマスター...................................................................................................................................................21

ページシーケンス...............................................................................................................................................22

ブロックレベル要素...................................................................................................................24ブロック要素.......................................................................................................................................................24

ブロックコンテナ...............................................................................................................................................24

リスト..........................................................................................................................................25

表.................................................................................................................................................26カラムの幅の設定...............................................................................................................................................26

表のセルの属性...................................................................................................................................................27

Page 3: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

インラインの FO........................................................................................................................29文字修飾..............................................................................................................................................................29

文字の大きさ ......................................................................................................................................................29

ルビの表現..................................................................................................................................30

脚注..............................................................................................................................................31

索引や目次の作成方法...............................................................................................................32

付録..............................................................................................................................................33XSL 仕様小史 .....................................................................................................................................................33

Page 4: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

はじめに

ドキュメントを XML 化する目的は、Web ページを作成したり、電子的に配布するデータを作り出す、電子的なマニュアルを作成する、など、いろいろあります。しかし、どのような意図で XML ドキュメントを作成するにしても奇麗にレイアウトして「紙」に印刷することを欠かすことができません。

しかし、ドキュメントを SGML や XML で作成した時、それを奇麗に組版して印刷するのは技術的に難しい課題です。SGML の時代からドキュメントを SGML 化することで、ワン・ソース・マルチユースが実現できると言われてきましたが、現実には紙に印刷することさえ簡単には実現できませんでした。

SGML、XML ドキュメントを印刷する方法として、今までよく使われてきたのは次のような方法です。

• XML を Perl などのスクリプトで MicrosoftWord の外部ファイル形式である RTF に変換する。RTF をWord などの RTF を読み込むアプリケーションで読み込んでレイアウトを調整して印刷する。レイアウト調整済み文書は RTF 形式になる。

• FrameMaker+SGML のスタイルを指定して、FrameMaker+SGML で読み込み、レイアウトを調整してから印刷する。この場合、レイアウト調整済み文書は FrameMaker の独自形式となる。

• 他の対話式組版ソフトや DTP ソフトの形式に変換し、組版ソフトや DTP ソフトでレイアウト調整して印刷する。レイアウト調整済み文書は、組版ソフトや DTP ソフトの形式となる。

しかし、これらの方法には問題があります。一番大きな問題は、XML コンテンツをアプリケーション独自の形式に変換してしまうことです。変換後のファイルに対してレイアウト調整を行うわけですが、レイアウト調整済み文書は元の XML コンテンツとは切り離されたアプリケーション独自のものになります。もし、ソースの XML コンテンツを変更したら、変換からレイアウトまでの操作をもう一度繰り返さなければなりません。

ドキュメントのソースを作ってから、レイアウト指定と調整を行い印刷するまでの流れは一サイクルで済むことはむしろ珍しく、普通は、校正などでソース変更とレイアウト調整のプロセスを何サイクルも通ります。従って、XML ソースを修正する都度、アプリケーションに読み込んでレイアウト調整が必要になるのでは、余計に手間がかかり、折角 XML でコンテンツを作った意味が薄くなってしまいます。そうかといって、レイアウト調整するアプリケーション上で文書の内容を修正したのでは、XML ソースと最終印刷物の内容がずれてしまいます。

こういったことを考えますと、コンテンツ XML 化の効果を上げるには XML コンテンツ作成、レイアウト調整、組版・印刷まで一連のフローを確立するのが理想的です。

Extensible Stylesheet Language 仕様は、Web の標準を定める団体である World Wide Web Consortium(W3C)で、「XML を奇麗にレイアウトして組版するための仕様」として、策定が進んでいるものです。この仕様の正式な略称は XSL ですが、現在、XSL という言葉は大変混乱していますので、本稿では XSL-FO と略記します(1)。

現在、InternetExplorer5 を使えば XML を表示したり印刷したりすることができるようになっています。しかし、これは、実際は内部で HTML に変換して表示しています。HTML にはページの概念がなく、IE5のようなブラウザはパソコンの画面で表示することを主たる目的として設計されています。このため、ブラウザではページレイアウトを指定するのが難しくなります。画面で表示してみるならブラウザが良いですが、「紙」への印刷では物足りません。

これに対して、XSL-FO にはページの概念がありますので、「紙」への印刷を前提とする多種類の機能を使用することができます。次は、その一例です。

• 見栄えの良い表紙を作る。• 本文とは違う印刷書式で目次を作成する。目次にはページ番号つける。• 左ページ、右ページで印刷書式を変更する。• 本文にヘッダ、フッタ、サイドバーを設ける。• ヘッダにページ番号を印刷する。• 索引を作成し、索引にページ番号を添える。• 脚注を付ける。• 段組の印刷書式を設定したページを作る。

(1)末尾の付録「XSL 仕様小史」を参照

Extensible Stylesheet Language(XSL-FO)解説

- 4 -

Page 5: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

組版プロセス概観

レイアウトしてページを作成する処理を組版処理といいますが、脚注などがありますと、組版処理を行うにはかなり高度なアルゴリズムが必要です。

XSL-FO を使う組版プロセスは次の図のようになります。XML 文書をいきなり組版するのではなく、第一段階で、XML ドキュメントを XSL-FO ドキュメントに変換します。次に、第二段階で、XSL-FO ドキュメントを組版処理します。

第一段階で使うプログラムが XSLT プロセサです。XSLT プロセサが、XML ドキュメントを XSL-FO に変換するためのルールを記述したものが XSLT スタイルシートです。ソースの XML ドキュメントと XSLTスタイルシートを XSLT プロセサに入力すると XML ドキュメントが XSL-FO ドキュメントに変換されます。

この XSL-FO ドキュメントは、レイアウトを指定した状態のもので、まだページにレイアウトされた状態ではありません。なお、XSL-FO ドキュメントを XSLT 以外の別の方法で作成しても構いません。

第二段階は、XSL-FO ドキュメントを XSL-FO プロセサ(組版エンジン)でページ組版します。XSL-FO プロセサは組版結果を用紙に印刷したり、PDF に出力したり、画面に表示したりします。

次に上述の組版プロセスで出てきましたいろいろな用語について、順に概略を説明します。

XML ドキュメント

XML ドキュメントの構成単位は要素です。要素とは、開始タグと終了タグで内容を囲ったものでタグには要素名を付けます。XML 文書の全体構造は、要素をツリー構造になるように配置したものです。要素のツリーは、通常、文書の論理的構造に従って構築します。

Extensible Stylesheet Language(XSL-FO)解説

- 5 -

Page 6: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

次の例は XML 文書の一部です。

XML 文書の一部(例)

<doc><head>

<title>スタイルシート解説</title><author>アンテナハウス株式会社</author><date>2001年 2月</date>

</head><body>

<section><title>スタイルシートとは</title>

...(略)...</section>...(略)...

</body></doc>

この例の中で、doc がルート要素(文書全体を囲むタグ)で、head 要素、body 要素はルート要素の子供、title、 author、date などの要素は、さらにその下位の要素になります。要素の名前は「要素型名」と言いますが、ユーザが自由につけることができます。正しい(wellformed な)XML ドキュメントは、ルート要素を最上位要素とするツリー構造で表すことができます。

「ドキュメントを XML 化するのはなんのためか?どんなメリットがあるのか?」という質問を良く聞きます。

XML では上のようにドキュメントの内容をタグで囲ってツリーで表現することで、タグを使ってツリー構造を簡単に変換できるということが大きなメリットです。ツリーの枝の順序を入れ替えたり、枝や葉をコピーしたり、削除したりなどの操作が簡単にできます。

ツリー構造を変えるということは、次の例のようにドキュメントの一部を複製したり、場所を変えたり、順番を入れ替えたりする操作に相当します。

• XML の中の要素の順番を並び替える=ドキュメントの内容の順序を並び替える• 二次元の配列になっていないものから二次元配列の表を自動的に生成する• 「title」など指定要素を選択してコピーする=目次を自動的に作り出す• 「index」などの指定要素をコピーする=索引を自動的に作り出す• 「note」要素を取り出して、ツリーに新しい枝(注の一覧など)を作る。ツリーの作り方次第で、注

の置き場所は、どこにでも簡単に移動できます。

バイナリ形式のワープロ・ドキュメントではこういった操作は簡単にはできません。「ツリー操作が簡単にできること」はドキュメントを XML 化する大きなメリットです。

XSLT とは?

XSLT というのは仕様の名前です(1)。

XSLT は、もともと、ソース XML 文書を XSL-FO 文書に変換するために設計された仕様です。これはXML 文書のツリー構造を変換することにあたります。それで XSLT は、XML から XSL-FO への変換に限らず、XML 文書を HTML 文書に変換したり、それ以外のツリー構造の変換用として汎用に使われるようになっています。

(1)詳細は付録を参照

Extensible Stylesheet Language(XSL-FO)解説

- 6 -

Page 7: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

XSLT の仕様を実現するプログラムが XSLT プロセサです。XSLT プロセサにはソース XML ドキュメントのツリーを変換するためのルールを外部ファイルとして与えます。このルールを記述したファイルをXSLT スタイルシート(または、XSL スタイルシート)と言います。

XSLT スタイルシートには入力 XML ドキュメントの要素を出力 XML ドキュメントの要素に変換するためのテンプレートを記述します。このテンプレートの作り方によって色々な XML のツリー変換を行うことができます。

XSLT プロセサ

XSLT は W3C の勧告になっており、勧告版の XSLT 仕様を実装する XSLT プロセサは沢山あります。その多くは無償で配布されています。現時点で、一番、機能的に強力な XSLT プロセサは、Microsoft が配布している MSXML3.DLL でしょう。これは、正式名称は「MSXML パーサー バージョン 3.0」と言い、2000 年 11 月 1 日から、Microsoft の Web サイトからダウンロードによる配布が始まっています。まだ、Internet Explorer5.5 には添付されていませんが、MS の開発者がメーリング・リストで発言しているところによりますと、Internet Explorer6 には添付されるようです。

MSXML3.DLL は、プログラムの部品(ライブラリー)です。Internet Explorer などから使うか、または、DLL を動かすプログラムを作成しないと、単独の XSLT プロセサとしては使えません。

そこで、コマンドラインから使用するためのユーティリティも、別途、Microsoft のサイトから入手することができます。

MSXML3.DLL

Microsoft が配布している XML プロセサで、XSLT 変換機能を備えています。

MSXSL.EXE

MSXML3.DLL は、DLL ですのでエンドユーザが直接使うことができません。MSXML3.DLL をインストールした PC に MSXSL.EXE をインストールしますと、DOS 窓からコマンドラインで XSLT変換ができます。

XSLT スタイルシート作成法

現在、XSLT スタイルシートの作成は、プログラマがエディタを使って行う状態で、簡単にスタイルシートを作成するツールはありません。米国には XSL のメーリング・リストがあり、1 日 100 件を越えるメールで XSLT の書き方等に関する議論がなされている状態で、XSLT スタイルシートに関する関心の高さがうかがえます。XSLT スタイルシートの作成は、現状では、トライアンドエラー状態です。しかし、XSLT スタイルシートの作成は、慣れれば比較的簡単にできます。今後、XML の普及に伴って XSLT スタイルシートが普及していくことは間違いないところです。

XSL-FO 用 XSLT スタイルシート

次に、XML 文書を、XSL-FO に変換する XSLT スタイルシートの例を示します。

XSL-FO 用スタイルシートの例

<?xml version="1.0" encoding="UTF-8" ?><xsl:stylesheet version="1.0"

xmlns:fo="http://www.w3.org/1999/XSL/Format"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml"version="1.0"indent="no" />

<xsl:param name="toc-make" select="true()"/>

<!-- Paper Size --><xsl:param name="paper-width" >

210mm</xsl:param><xsl:param name="paper-height">

297mm</xsl:param>

Extensible Stylesheet Language(XSL-FO)解説

- 7 -

Page 8: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

...中略...<!-- Content Transform--><xsl:template match="doc">

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"><fo:layout-master-set><fo:simple-page-master margin-top="5mm"

margin-bottom="5mm"margin-right="5mm"margin-left="10mm"master-name="PageMaster">

...中略...</fo:simple-page-master>

...中略...</fo:layout-master-set>

...中略...</fo:root>

</xsl:template></xsl:stylesheet>

この XSLT スタイルシートの中で、xsl:という接頭子(ネームスペース接頭子)で始まる要素が XSLT 仕様で決まっているルール記述用の要素です。また、fo:という接頭子で始まっている要素が、XSL-FO ドキュメントに出力される要素です。

XSL-FO に変換するための XSLT スタイルシートを作成するには、XSLT のルールの書き方と、それに加えて、XSL-FO に関する知識が必要となります。XSL-FO ではページや行間隔も細かく指定しますので、HTML に変換する XSLT スタイルシートを作成するよりは時間がかかります。

しかし、上の例の XSLT スタイルシートは、PureSmartDoc 形式で記述された XML ファイルを XSL-FO に変換するための汎用の XSLT スタイルシートとしても使うことができます。

このように、ある DTD に従う XML ファイルについては、スタイルシートをひとつ作成すれば XSL-FOドキュメントに変換できます。もしレイアウトを調整するにしても若干の調整で済みます。ひとつのスタイルシートを使い回すことで、効率をあげることができます。

特に、印刷物ではレイアウト指定の良し悪しが、見易さ、読み易さに大きな影響を与えます。優れたスタイルシートを作るのは、プログラムの知識だけではなく、デザインの能力も必要となります。今後は、優れたスタイルシートの市場が生まれる可能性もあるでしょう。

XSL-FO ファイルの例

XSL-FO ファイルは、fo:root をルート要素とする wellformed な XML ファイルです。次に XSL-FO ファイルの先頭部分の例を示します。

XSL-FO ファイルの例

<?xml version="1.0" encoding="UTF-16"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">

<fo:layout-master-set><fo:simple-page-master margin-top="5mm"

margin-bottom="5mm"margin-right="5mm"margin-left="10mm"master-name="PageMaster"page-height="297mm"page-width="210mm">

<fo:region-body margin-top="8mm"margin-right="8mm"margin-bottom="8mm"margin-left="8mm"/>

<fo:region-before border-after-style="solid"border-width="thin"extent="5mm"

Extensible Stylesheet Language(XSL-FO)解説

- 8 -

Page 9: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

display-align="after"/><fo:region-after border-before-style="solid"

border-width="thin"extent="5mm"display-align="before"/>

<fo:region-start reference-orientation="270"extent="5mm"/>

<fo:region-end reference-orientation="90"extent="5mm"/>

</fo:simple-page-master>...中略...</fo:layout-master-set>...中略...

</fo:root>

世界の XSL-FO プロセサ

XSL-FO ファイルをページ組版する処理を担当する「組版エンジン」が XSL-FO プロセサです。現在、世界で公開されている XSL-FO プロセサには次のようなものがあります。

名称 特徴

Antenna House XSL FormatterV1.1 アンテナハウスの XSL-FO 組版エンジンとユーザ・インターフェイス(GUI)。組版エンジンは、日本語も英語も関係なく使うことができます。GUI は、日本語版(V1.1J)と英語版(V0.1、V1.1E は準備中)があります。コマンドライン・インターフェイス、COM サーバ・インターフェイスもあります。

FOP Web サーバの開発で有名な Apache が取り組んでいる JAVA 版 XSL-FO組版エンジン。XSL-FO から PDF を出力する。2001 年 1 月時点で、0.16版が配布されています。オリジナルでは日本語を使うことはできないが、日本語を使うパッチが公開されています。

XEP 米国の RenderX というベンチャー企業の JAVA 版 XSL-FO 組版エンジン。やはり、FO から PDF を出力する。日本語は使えません。

PassiveTeX FO を処理する TeX のマクロライブラリー(組版エンジンは TeX を使用)。

UFO Unicorn 社の FO を TeX のマクロに変換する開発ツール(組版エンジンは TeX を使用)。

組版結果の例本解説書は、XML ドキュメントとして記述して、XSL-FO に変換し、Antenna House XSL Formatter で組版

したものです。ブラウザとは違って、ページ番号やヘッダの設定が行われて、印刷物としての体裁になっていることを確認していただけることでしょう。

Extensible Stylesheet Language(XSL-FO)解説

- 9 -

Page 10: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

XSL-FO 仕様の概要

現状XSL-FO 仕様は、2000 年 11 月 21 日 Candidate Recommendation になりました。Candidate Recommendation

は仕様として安定した状態となり、XSL-FO プロセサを実装してください、という段階です。今後、Proposed Recommendation 次いで Recommendation と進むことになっています。

XSL-FO の仕様書は、エンドユーザ向けではなく開発者向けに書かれています。最初に、XSL-FO プロセサが担当するページ組版プロセスの概念を説明し、さらに XSL-FO プロセサが準拠するレイアウト・モデルを規定しています。

さらに、XSL-FO ドキュメントの要素である Formatting Objects(以下、FO と言います)を規定します。FO とは、段落、リスト、表などの組版の対象になるもののことです。FO には、ページマスターの記述方法やマージンや本文領域の設定方法等ページネーション用のもの、段落やヘッドラインなどブロック・レベルのもの、行中に配置されるインライン・レベルのものなど 56 種類があります。

ページの大きさやエリアの広さ、文字のフォント名やフォントのサイズなどは FO のプロパティで表します。プロパティは 246 種類あり、中には CSS2 の仕様からコピーされたものが多くあります。FO のレイアウト仕様は CSS2 を強く意識して設計されています。

XSL-FO の仕様 Version 1 ではまだ高度なページレイアウトは困難ですが、操作説明書、報告書などのレベルであれば充分実用に耐えると考えています。

組版プロセス組版というのは、XSL-FO ドキュメントを読者の目に見える形式(出力形式)にすることです。XSL-FO の

仕様書では、数段階を踏んで組版するプロセスを解説していますが、組版ソフトは必ずしも XSL-FO の仕様書どおりのステップを踏む必要はなく、出力形式が仕様書に書かれた制約に従っていれば良いということになっています。

AntennaHouse XSL Formatter は、XSL-FO 仕様のプロセスをできるだけ忠実に実装しており、Formatter の組版オプションを設定すれば、FO ファイル、リファインされた FO ファイル、エリア・ツリーをファイルとして出力できます。

以下では XSL-FO の仕様について理解を深めるため、仕様書に記述されている組版プロセスについて簡単に説明します。

エリア・モデル

XSL-FO の仕様の組版モデルはエリア・モデルといいます。XSL-FO のエリア・モデルは、CSS2 のボックス・モデルにほぼ対応しています。CSS2 のボックスは XSL-FO のエリアに相当し、CSS2 の仕様で現れる要素は XSL-FO では Formatting Object に相当します。

XSL-FO ドキュメントの FO は、出力媒体の領域と対応づけられている訳ではありません。エリアが出力媒体上の四角い領域に対応付けられます。

XFL-FO プロセサは、FO からエリアを作り出すことで、XSL-FO ドキュメント・ツリーをエリア・ツリーに変換します。エリア・ツリーはドキュメントの中の文字、図形やイメージを配置するための位置情報、間隔空けの情報やその他組版のために必要な情報を含む順序づけられたツリーです。

エリアはブロック・エリアとインライン・エリア(行内エリア)の2種類に分類できます。ブロック・エリアのひとつにライン・エリア(行エリア)がありますが、ライン・エリアはその子供がすべてインライン・エリアになります。また、インライン・エリアのひとつにグリフ・エリアがありますが、グリフ・エリアは子供をもたず、内容文字のグリフであるという末端のエリアになります。

エリア・ツリーと出力媒体の上の領域との対応関係は次の図のようになります。「P」がページ、「A、B、C」はブロック・エリア、「XY」がライン・エリア、「あ、い、う」がインライン・エリアに相当します。

Extensible Stylesheet Language(XSL-FO)解説

- 10 -

Page 11: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

リファレンス・オリエンテーション

ページ全体については用紙の上が top、下が bottom、左が left、右が right となります。これは絶対方向です。ページの内部のエリアの中には座標系を設定できる参照エリアがあります。参照エリアの座標系は、その参照エリアを設定する FO の reference-orientation プロパティを設定することで、絶対方向を変更することができます。reference-orientation の値は初期値は 0 です。例えば 90 を指定しますと、指定したエリアの参照エリアは、その親の参照エリアの方向に対して反時計廻りに 90 度回転します。

例えば、Bの reference-orientation プロパティを 270 に設定しますと次のように、Bの領域の top はPのtop に対して 270 度回転します。

参照エリアを生成できる FO は次のものです。

• fo:simple-page-master• fo:region-body• fo:region-before• fo:region-after• fo:region-start• fo:region-end• fo:table

Extensible Stylesheet Language(XSL-FO)解説

- 11 -

Page 12: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

• fo:block-container• fo:inline-container

ライティング・モードエリアの中に、その子供のブロックを配置するときブロックの進行方向は、行の進行方向に相当しま

す。また、インライン・エリアにその子供のエリアを配置するときその子供エリアの進行方向は、テキストの文字を進める方向に相当します。これをライティング・モードと言います。ライティング・モードの初期値は行の進行方向は上から下、文字の進行方向は左から右です。参照エリアを設定できる FO に対しては writing-mode プロパティを設定することで、ライティング・モードを変更することができます。

writing-mode プロパティの値は次のものがあります。

lr-tb(初期値)

インラインのエリア、テキストの文字は左から右に進み、行とブロックは上から下に進む。

rl-tb

インラインのエリア、テキストの文字は右から左に進み、行とブロックは上から下に進む。アラビア語、ヘブライ語で使われる。

tb-rl

インラインのエリア、テキストの文字は上から下に進み、行とブロックは右から左に進む。日本語、中国語の縦書きで使われる。

次の図は、Bの writing-mode プロパティを tb-rl に設定し、Bブロックを縦書きとした例です。reference-orientation は 0 です。

ブロックとインラインの進行方向エリアの属性と属性値はトレイトと言います。トレイトはエリアをレンダリングしたりあるいはエリア

の組版の制約を規定するのに使われます。トレイトには FO のプロパティと直接対応しているものもありますし、間接的に導き出されるものもあります。

FO からエリアが作られる際にエリアのトレイトが決まります。例えば FO の reference-orientation とwriting-mode によって、参照エリアのブロックとインラインのエリアの進行方向が決定されます。これは、エリアの block-progression-direction と inline-progression-direction というトレイトになります。

エリアの中にさらに他のエリアやテキストを配置する領域は内容領域です。内容領域の周囲にパディング領域、ボーダー領域をもち、それぞれの周辺が内容境界、パディング境界、ボーダー境界となります。周囲にスペース(余白)を持つこともあります。これらの領域の配置はエリアの block-progression-direction とinline-progression-direction によって決まります。

Extensible Stylesheet Language(XSL-FO)解説

- 12 -

Page 13: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

ブロックの進行方向の前が before、後ろが after になります。インラインの進行方向の前が start、後ろがend です。

Keep と Break

ページ参照エリア(ページ・マージンの内側=region-body のマージンを含む領域)、カラム・エリア(段組の段領域)、ライン・エリアの 3 種類のエリアをコンテキスト・エリアと言い、コンテキスト・エリア内でKeep と Break 条件を設定できます。

Break には break-before、break-after の2つの条件があります。それぞれ FO の break-before、break-after プロパティに、page、even-page、odd-page、column、auto を指定することで設定されます。例えば FO のbreak-before を page に設定すれば、その FO から生成される最初のエリアは、常にページ参照エリアの中で先頭のエリアになります。同様に例えば FO の break-after を page に設定すれば、その FO の生成する次のエリアが、ページ参照エリア内に存在しないか、次のエリアはページ参照エリアの先頭になります。auto にするとなにも Break 条件が設定されません。

Keep には keep-with-previous、keep-with-next、keep-together の3つの条件があります。それぞれ、FO のkeep-with-previous、keep-with-next、keep-together の within-page、within-column、within-line コンポーネントに

Extensible Stylesheet Language(XSL-FO)解説

- 13 -

Page 14: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

強度を示す値を設定するか always とします。数字が大きいほど強く always は最強の条件となります。autoにすれば Keep 条件はなにも設定されません。

エリア・ツリーは、すべての Break 条件を満たすように設定されます。Keep 条件の方は、Break 条件が満たされないか、より強い Keep 条件は失敗するような範囲で満たされます。

FO のプロパティからエリアのトレイトへ

FO のプロパティでは、レイアウト指定のパラメータを設定します。プロパティの値は、簡略記述したり、相対値や計算値で指定、あるいは、省略することもできます。このため組版エンジンは、まずプロパティ・リファインメントという処理でパラメータをエリアのトレイトに計算します。リファインメントの処理は次の2つのステップを踏んで行います。

第一ステップ

ショートハンド・プロパティ(簡略表記法)を個別のプロパティに展開します。継承、初期値で与えられた属性値を FO に付与し、属性値を計算式で指定している場合にはそれを計算、相対的な数値を絶対値に換算、二つ以上の属性から複合属性を作り出す、などの処理を行ってプロパティの値を確定します。

第二ステップ

プロパティをトレイトに変換します。

ショートハンド・プロパティXSL-FO では、2種類のショートハンド・プロパティを使えます。border のように CSS から直接もってき

たものと page-break-inside のように CSS のプロパティを分解したり結合したりしたものです。両方とも同じように処理されます。ショートハンドは親から継承されず、展開した個々のプロパティが継承されます。

CSS では、関係するショートハンドと個々の関係するプロパティの処理順位をユーザが指定しますが、XML の属性には優先順位がないので XSL-FO では優先順位を定義しています。原則はより詳細な指定の方が優先度が高くなります。個々のプロパティはショートハンドよりも優先順位が高く、例えば、border よりborder-top の方がより詳しく、さらに border-top-color の方がより詳しくなります。このような優先順位を考慮して、ショートハンドを展開します。

数値の表現数値には、絶対数値と相対数値があります。

• 絶対数値は数字と絶対単位からなります。• 相対数値は%、または相対長があります。相対長は数字と相対単位からなります。

数値の指定においては、+(和)、-(差)、*(積)、div(割算)、mod(残余)計算を使えます。

カラーは、RGB(red, green, blue)と ICC(International Color Consortium)の指定ができます。

分類 名前 定義

絶対単位 cm

mm

in 2.54cm

pt 1/72in

pc 12pt

px 通常の距離で見られる印刷、ディスプレイ、ハンドヘルド機器では 0.28mm(約 1/90 インチ)が望ましいが、1/92 インチまたは 1/72 インチのような値にしても良い。

相対単位 em 現在の font-size プロパティの値を単位とします。1em は現在の font-size と同じです。

Extensible Stylesheet Language(XSL-FO)解説

- 14 -

Page 15: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

XSL-FO の一覧

次に FO の一覧表を掲載します。

宣言、ページネーション、ページレイアウトの FO

FO の名前(要素名) 説明

6.4.2 fo:root FO ツリーのトップ・ノード

6.4.3 fo:declarations スタイルシートのグローバル宣言のグループ化

6.4.4 fo:color-profile スタイルシートの ICC カラー・プロフィールを宣言する

6.4.5 fo:page-sequence 文書のページの並びを生成する方法を規定する

6.4.6 fo:layout-master-set 文書で使われる全てのマスターを囲む

6.4.7 fo:page-sequence-master ページの並びを生成するためのページ・マスターのセットの制約や順序を規定する

6.4.8 fo:single-page-master-reference ひとつのページ・マスターのひとつのインスタンスからなる下位の並びを規定する

6.4.9 fo:repeatable-page-master-reference ひとつのページ・マスターの繰り返しのインスタンスからなる下位の並びを規定する

6.4.10 fo:repeatable-page-master-alternatives いくつかの代替可能なページ・マスターのセットからなる繰り返しの並びを規定する

6.4.11 fo:conditional-page-master-reference 使用条件を指定して、その条件を満たした時に使われるページ・マスターを識別するのに使われる

6.4.12 fo:simple-page-master ページの領域を定義し、ページを生成するのに使われる

6.4.13 fo:region-body ページの中央のビューポートと参照エリアの対を規定する

6.4.14 fo:region-before ページ参照エリアの前の領域

6.4.15 fo:region-after ページ参照エリアの後ろの領域

6.4.16 fo:region-start ページ参照エリアのスタート側領域

6.14.17 fo:region-end ページ参照エリアのエンド側領域

6.14.18 fo:flow ページの中に分布する流し込みテキストを供給するフロー・オブジェクトの並びを規定する

6.14.19 fo:static-content 複数のページの中のひとつの領域に置かれる。静的なヘッダやフッタ等に使う

6.14.20 fo:title 文書のタイトルを関連づける

ブロック・レベルの FO

FO の名前(要素名) 説明

6.5.2 fo:block 段落、タイトル、ヘッドライン、図、テーブルのキャプション等

Extensible Stylesheet Language(XSL-FO)解説

- 15 -

Page 16: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

FO の名前(要素名) 説明

6.5.3 fo:block-container ライティング・モードの異なるエリア等ブロック・レベルの参照エリアを生成する

インラインレベルの FO

FO の名前(要素名) 説明

6.6.2 fo:bidi-override Unicode の bidi アルゴリズムが失敗した時使われる

6.6.3 fo:character グリフにマップする文字を表す

6.6.4 fo:initial-property-set fo:block の最初の行のフォーマット特性を表す

6.6.5 fo:external-graphic FO の要素ツリーの外部グラフィック・データ

6.6.6 fo:instream-foreign-object インライン・グラフィックやその他のジェネリックなオブジェクト

6.6.7 fo:inline バック・グラウンド、囲みなどをもつテキストの一部を指定するのに使う

6.6.8 fo:inline-container インラインの参照エリアを生成する

6.6.9 fo:leader リーダ罫を発生する

6.6.10 fo:page-number ページ番号を内容にもつインライン・エリアを得る

6.6.11 fo:page-number-citation 引用された FO によって作られる最初のエリアを含むページのページ番号を参照する

表の FO

FO の名前(要素名) 説明

6.7.2 fo:table-and-caption 表とキャプションを一緒に組版するため

6.7.3 fo:table 表の表部分の組版用

6.7.4 fo:table-column 表のカラム幅のように同じカラムとスパンをもつセルに特性を設定する

6.7.5 fo:table-caption fo:table-and-caption を使うときのキャプションを指定

6.7.6 fo:table-header 表のヘッダの内容

6.7.7 fo:table-footer 表のフッタの内容

6.7.8 fo:table-body 表の本体の内容

6.7.9 fo:table-row 表のセルを行にグループ化する

6.7.10 fo:table-cell 表のセルに配置する内容をグループ化する

Extensible Stylesheet Language(XSL-FO)解説

- 16 -

Page 17: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

リストの FO

FO の名前(要素名) 説明

6.8.2 fo:list-block リストを組版するためのフロー・オブジェクト

6.8.3 fo:list-item リストの項目のラベルとボディを含む

6.8.4 fo:list-item-body リストの項目の内容を含む

6.8.5 fo:list-item-label リストの項目のラベルを含む

リンクとマルチ FO

FO の名前(要素名) 説明

6.9.2 fo:basic-link 単純な 1 方向の1ターゲットのリンクの開始リソース

6.9.3 fo:multi-switch FO の代替サブ・ツリーの指定を囲み、切替を制御する

6.9.4 fo:multi-case FO の各代替サブ・ツリーを含む

6.9.5 fo:multi-toggle multi-case を切り替えて表示するためのエリア

6.9.6 fo:multi-properties 複数のプロパティ・セットを切り替えるために使われる

6.9.7 fo:multi-property-set FO の代替サブ・ツリーのプロパティ

アウト・オフ・ラインの FO

FO の名前(要素名) 説明

6.10.2 fo:float 普通、イメージをページの先頭、左右に配置し、フローオブジェクトはその廻りに流す時に使う

6.10.3 fo:footnote ページの region-bodyとページの後ろの端の脚注の部分に、脚注の引用を作り出すのにつかう

6.10.4 fo:footnote-body 脚注の内容を生成するのに使う

その他の FO

FO の名前(要素名) 説明

6.11.2 fo:wrapper FO のグループでプロパティの継承を指定するのに使う

6.11.3 fo:marker ランニング・ヘッダ、ランニング・フッタを作り出すために fo:retrieve-marker と一緒に使う

6.11.4 fo:retrieve-marker  同上

Extensible Stylesheet Language(XSL-FO)解説

- 17 -

Page 18: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

フォーマッテイング・プロパティ

FO のプロパティの多くは CSS2 からコピーされており、3つのグループに大きく分類されています。

第一グループは、多数の FO に適用されるもので9つのサブグループに分類されます。

共通のアクセシビリティ・プロパティ

アクセシビリティをサポートするためのプロパティ

共通の絶対位置決め用プロパティ

絶対位置指定のエリアの位置と大きさを制御するためのプロパティ

共通の聴覚プロパティ

FO の内容の音声によるレンダリングを制御するためのプロパティ

共通のボーダー、パディング、バックグラウンドのプロパティ

ブロック・エリアとインライン・エリアのバックグラウンド、ボーダー、パディングを制御するためのプロパティ

共通のフォント・プロパティ

テキストを含む FO のフォントの選択を制御するためのプロパティ

共通のハイフネーション・プロパティ

ライン分割を制御するためのプロパティ、言語、スクリプト、国を含む。

共通のマージン・プロパティ-ブロック

ブロック・レベル FO を囲むスペースとインデントを設定する。

共通のマージン・プロパティ-インライン

インライン・レベル FO を囲むスペースを設定する。

共通の相対位置決め用プロパティ

相対的な位置決めされるエリアの位置を制御するためのプロパティ。

残りのプロパティは、幾つかの FO に適用されるものです。同じような機能をもつものに分類されています。

エリアの配置用プロパティ

インライン・エリアの相互配置を制御するためのプロパティ。特に、異なるスクリプトの異なるベースラインの調整など。また、ブロック・エリアの位置を調整するための display-align、relative-align というプロパティもある。

エリアの大きさ用プロパティ

エリアのブロック・エリアとインライン・エリアの大きさなどを制御するプロパティ

ブロックとライン関係のプロパティ

ライン・エリアの構築とそれを含むブロック・エリアの中でライン・エリアをどのように配置するかを管理するプロパティ

文字のプロパティ

テキストの表示を制御するプロパティ。ワードの間隔調整、文字の間隔調整など。

カラー関連プロパティ

カラー管理とカラーモデル選択用プロパティ

フロート関連プロパティ

サイドフローと before-float を管理するプロパティ

Keeps and Breaks プロパティ

ページ、カラム、ラインの中で同一にしたり分割したりするためのプロパティ。ウィドウ、オーファンや内容を一緒にすることを含む。

レイアウト関連のプロパティ

top や、クリッピング、オーバーフロー、カラムをまたがるためのプロパティ。

リーダとルールのプロパティ

リーダと水平線を管理するためのプロパティ

Extensible Stylesheet Language(XSL-FO)解説

- 18 -

Page 19: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

ダイナミック効果のプロパティ

リンクやその他のダイナミックな効果に関連する表示、動作を管理するプロパティ。

マーカーのプロパティ

マーカーを生成したり検索するためのプロパティ。マーカは主として辞書のようなヘッダやフッタのために使用する。

番号と文字を変換するためのプロパティ

ページ番号やその他のフォーマッタ・ベースの番号付けを構築するためのプロパティ。

ページネーションとレイアウトのプロパティ

ページの順序、レイアウト、生成を管理するためのプロパティ。ページの大きさ、ページの方向、ページマスターの領域の大きさ、ページマスターの識別や選択、ボディ領域をカラムに分割、コンテント・フローをレイアウト領域に割当するなど。

表のプロパティ

表のレイアウトと表示を管理するプロパティ。

ライティング・モード関連のプロパティ

ブロックの進行方向、インラインの進行方向などに影響を与える様々な方向性とライティング・モードに関連するプロパティ。

各種のプロパティ

その他、分類できないプロパティ

この他にショートハンド・プロパティがあります。ショートハンド・プロパティは、個別のプロパティに展開されます。

Extensible Stylesheet Language(XSL-FO)解説

- 19 -

Page 20: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

ページネーションの基本

XSL-FO ドキュメントの構成

XSL-FO のツリーの概要は次の図のようになります。ルート・ノードは fo:root ですが、その子供として 1つの fo:layout-master-set、fo:declarations(オプション)、一つ又はそれ以上の fo:page-sequence が来ます。

fo:layout-master-set は内容を割り付けるレイアウト用紙とその並び、すなわちレイアウトマスターを必要数だけ規定します。

fo:declarations は、オプションでカラー・プロフィールなどのリソースを記述します。

fo:page-sequance(ページシーケンス)には、ページに流し込む内容を子供として配置します。

XSL-FO プロセサは、fo:page-sequence の内容を、対応する名前のレイアウトマスターで規定されるレイアウト用紙に流し込んで行ってページを生成します。ページシーケンスを、どのレイアウトマスターを使って生成するかは fo:page-sequence の属性 master-name の値に、レイアウトマスターの名前を設定することで指定します。

次の例は、表紙用(cover)と本文用(body)という2種類のレイアウトマスターを作成し、表紙と本文の2つのページシーケンスを2つの用紙に生成するものです。

XSL-FO ドキュメントの構成<fo:root>

<fo:layout-master-set><fo:simple-pagemaster master-name="cover">............................................</fo:simple-pagemaster><fo:simple-pagemaster master-name="body"></fo:simple-pagemaster>............................................

</fo:layout-master-set><fo:page-sequence master-name="cover">

......................

......................

......................</fo:page-sequence><fo:page-sequence master-name="body">

......................

......................

......................</fo:page-sequence>

</fo:root>

Extensible Stylesheet Language(XSL-FO)解説

- 20 -

Page 21: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

レイアウトマスターセットレイアウトマスターには、fo:simple-page-master と fo:page-sequence-master の 2 種類に分類されます。いづ

れもレイアウトマスターセットの子供として定義します。

レイアウトマスターの基本は、1 ページの大きさ、本文領域、ヘッダ、フッタ、サイドバー(左右)を規定する fo:simple-page-master(ページマスター)です。

レイアウトマスターのもうひとつの種類は、ページの並び順を規定する fo:page-sequence-master です。fo:page-sequence-master は、ひとつのページマスターからなる fo:single-page-master-reference とページマスターの繰り返しを規定する fo:repeatable-page-master-reference、fo:repeatable-page-master-alternatives があります。fo:repeatable-page-master-reference は、ひとつのページマスターの繰り返しを規定し、 fo:repeatable-page-master-alternatives はページマスターの組み合せの繰り返しを規定します。

fo:repeatable-page-master-alternatives では、偶数ページと奇数ページでページマスターを切り替えたり、最初のページ、最後のページ、ブランク・ページでページマスターを切り替えるなどができます。また、maximum-repeats プロパティで最大の繰り返し回数を設定できます。

それぞれのレイアウトマスターには master-name 属性の値にユニークな名前を設定します。

ページマスターページマスターはレイアウト用紙を定義するもので、ページマスターが一回使われる毎に一枚の用紙を

生成します。例えば、fo:repeatable-page-master-reference から fo:simple-page-master を参照している場合、fo:page-sequence の中からページマスターが呼ばれる毎に1ページを生成します。

XSL-FO 仕様の Version1 では、ページマスターには fo:simple-page-master しかありません。一つの XSL-FO ドキュメントでいろいろな用紙を使う場合は、fo:simple-page-master を沢山定義することができますが、master-name プロパティにユニークな名前を付けて区別します。

fo:simple-page-master にはその子要素として、fo:region-body、fo-region-before、fo:region-after、fo-region-start、fo-region-end の5つの領域を指定します。次にひとつの例を示します。

ページマスター<fo:layout-master-set>

<fo:simple-page-master margin-top="5mm"margin-bottom="5mm"margin-right="5mm"margin-left="10mm"master-name="PageMaster"page-height="297mm"page-width="210mm">

<fo:region-body margin-top="8mm"margin-right="8mm"margin-bottom="8mm"margin-left="8mm"/>

<fo:region-before border-after-style="solid"border-width="thin"extent="5mm"display-align="after"/>

<fo:region-after border-before-style="solid"border-width="thin" extent="5mm"display-align="before"/>

<fo:region-start reference-orientation="270"extent="5mm"/>

<fo:region-end reference-orientation="90"extent="5mm"/>

</fo:simple-page-master><fo:simple-page-master master-name="PageMaster-Cover">

<fo:region-body margin-top="8mm"margin-right="8mm"margin-bottom="8mm"margin-left="8mm"/>

</fo:simple-page-master></fo:layout-master-set>

Extensible Stylesheet Language(XSL-FO)解説

- 21 -

Page 22: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

上の例では次のようなページを設定しています。

• ページマスターの名前は、PageMaster とする• 全体の用紙サイズは A4 縦とする• 本文にはページの上に文書タイトル,ページの下にページ番号を表示するエリアを確保する• 本文以外はページ番号などは表示しない

通常の横書モードでは、fo:region-before がヘッダ、fo:region-after がフッタ、fo:region-start が左サイドバー、fo:region-end が右サイドバーに相当します。

ページの中の領域の幾何的な配置は次の図のようになります。ページのサイズは page-width と page-heightで指定します。ページには上下、左右に margin-top、margin-bottom、margin-left、margin-right が取られます。その内側に、region-body のマージンを取ります。region-before、region-after、region-start、region-end はページマージンの内側に接して、region-bodyのマージン領域に配置されます。

各 region には名前を指定する手間を省くため既定値で次の名前が決まっています。region-body の名前はxsl-region-body、 region-before は xsl-region-before、 region-after は xsl-region-after、 region-start は xsl-region-start、region-end は xsl-region-end となります。

ページシーケンス

fo:page-sequence はフローと呼ばれ、レイアウトマスターの5つの領域に配置するコンテンツを指定します。フローには静的なもの fo:static-content と fo:flow があります。fo:static-content は、通常はヘッダやフッタの領域に配置され、すべてのページに繰り返されます。fo:flow は、通常は本文(fo:region-body)に配置されるテキストを内容として持ちます。

次は、ヘッダに「Extensible Stylesheet Language(XSL-FO)解説」という固定文字列、フッタにページ番号(fo:page-number)を配置する例です。

Extensible Stylesheet Language(XSL-FO)解説

- 22 -

Page 23: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

ページシーケンス

<fo:page-sequence master-name="PageMaster"><fo:static-content flow-name="xsl-region-before">

<fo:block text-align="center" font-size="small">Extensible Stylesheet Language(XSL-FO)解説</fo:block>

</fo:static-content><fo:static-content flow-name="xsl-region-after">

<fo:block text-align="center" font-size="small">- <fo:page-number/> -</fo:block>

</fo:static-content><fo:static-content flow-name="xsl-region-start">

<fo:block text-align="center" font-size="small"/></fo:static-content><fo:static-content flow-name="xsl-region-end">

<fo:block text-align="center" font-size="small"/></fo:static-content><fo:flow flow-name="xsl-region-body">

-----本文に配置する内容(省略)----</fo:flow>

</fo:page-sequence>

XSL-FO プロセサは fo:page-sequence を処理する際、fo:page-sequence の master-name プロパティで指定しているページマスターまたは fo:page-sequence-master を参照してページを作り出します。

ひとつひとつのフローには、flow-name プロパティで名前を設定します。ページマスターの中の領域とフローの対応関係を flow-map によって決定します。XSL-FO 仕様の Version1 では、flow-map は暗黙の前提となっています。

Extensible Stylesheet Language(XSL-FO)解説

- 23 -

Page 24: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

ブロックレベル要素

ブロックレベルの FO には、fo:block と fo:block-container があります。

ブロック要素

XSL-FO では、本文テキストには見出し要素、段落要素などの区別がなく、テキストはすべて fo:block の内容となります。フォントの種類や文字の大きさなどは fo:block のプロパティとして指定します。

次の例は、見出の fo:block です。フォントサイズを 14 ポイントに設定し、常に本文と同一の頁、カラムに配置されるように keep-with-next 属性を設定しています。

fo:block

<fo:blockfont-size="14pt"space-before="0.5em" space-before.precedence="1"space-after="0.5em"keep-with-next.within-page=" always"keep-with-next.within-column="always"start-indent="10mm"end-indent="10mm"id="IDwfmY1">--見出しのブロック要素--

</fo:block>

ブロックコンテナ

fo:block-container は、横書文書の中に部分縦書を挿入するなど、本文と異なるライティング・モードのエリアを組み込むのに一般的に使います。

次は、fo:block-container を使って本文に部分縦書を埋め込む方法の例です。

fo:block-container による部分縦書<fo:block-container

writing-mode="tb-rl"padding-before="3pt"padding-after="3pt"padding-start="3pt"padding-end="3pt"width="168mm"height="60mm">

<fo:block text-indent="1em"space-before="0.6em"space-after="0.6em"start-indent="10mm"end-indent="10mm"text-align="justify">--本文テキスト(略)--</fo:block>

</fo:block-container>

ドキュメントをX

ML

化する

目的は、W

eb

ページを作成した

り、電子的に配布するデータを

作り出す、電子的なマニュアル

を作成する、など、いろいろあ

ります。しかし、どのような意

図でX

ML

ドキュメントを作成

するにしても奇麗にレイアウト

して「紙」に印刷することは欠

かすことができません。

ところが、X

ML

はHTM

L

は異なり、タグの名前やドキュ

メントの構造を自由に定義でき

ます。このため、X

ML

のタグ

を、そのまま印刷のためのレイ

アウト指定に用いることはでき

ません。

これはSG

ML

でも同じ事情

です。ドキュメントをSG

ML

やXM

L

で作成した時、それを

奇麗に組版して印刷するのは技

術的に大きな課題となっていま

す。

Extensible Stylesheet Language(XSL-FO)解説

- 24 -

Page 25: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

リスト

XSL-FO では、箇条書を fo:list-block によって作成します。各箇条は、fo:list-item になり、list-item の中にfo-list-item-label(リストのマークを表示する部分)と list-item-body(リストのコンテンツを表示する部分)を配置します。

注意すべき点が二つあります。

1. XSL-FO ではリストのラベル項目を明示的に指定する必要があります。したがって箇条書きであれば箇条書き項目の先頭の記号を、番号付きリストであれば xsl:number で明示的に番号を振らなければなりません。

2. デフォルトスタイルシートが存在しないので,list-item-label の指定位置や list-item-body の開始位置を明示的に指定しなければなりません。

XSL-FO のリスト<fo:list-block>

<fo:list-item><fo:list-item-label start-indent="inherit+ 5mm"

end-indent="label-end()"><fo:block>&#x02022;</fo:block>

</fo:list-item-label><fo:list-item-body start-indent="body-start()">

<fo:block>...................................</fo:block></fo:list-item-body>

</fo:list-item><fo:list-item>

<fo:list-item-label start-indent="inherit+5mm"end-indent="label-end()">

<fo:block>&#x02022;</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()">

<fo:block>...................................</fo:block></fo:list-item-body>

</fo:list-item></fo:list-block>

Extensible Stylesheet Language(XSL-FO)解説

- 25 -

Page 26: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

XSL-FO の表は、次のような構造をしています。

fo:table-and-caption

表と表のキャプションを一緒に組版するとき使う

fo:table

表形式になっている部分を組版するのに使う。ひとつの表は、ヘッダとフッタとボディから構成する。ヘッダとフッタはオプション。Break されたときヘッダとフッタを繰り返すかどうかをプロパティで指定する

XSL-FO の表<fo:table-and-caption><fo:table><fo:table-header>

<fo:table-row><fo:table-cell><fo:block>........</fo:block></fo:table-cell>

</fo:table-row><fo:table-row>

<fo:table-cell><fo:block>........</fo:block></fo:table-cell>

</fo:table-row></fo:table-header><fo:table-body>

<fo:table-row><fo:table-cell><fo:block>........</fo:block></fo:table-cell>

</fo:table-row><fo:table-row>

<fo:table-cell><fo:block>........</fo:block></fo:table-cell>

</fo:table-row></fo:table-body></fo:table></fo:table-and-caption>

カラムの幅の設定fo:table の子供要素の fo:table-column はオプションですが、同じカラムとスパンを有するセルの特性を指

定するとき使います。なかでも、一番重要なのは表のカラム幅の設定です。これは、fo:table-column のcolumn-width プロパティで指定します。

Extensible Stylesheet Language(XSL-FO)解説

- 26 -

Page 27: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

カラム幅の設定<fo:table-column column-number="1" /><fo:table-column column-number="2" column-width="24pt" /><fo:table-column column-number="3" column-width="6em" /><fo:table-column column-number="4"

column-width="proportional-column-width(4)" /><fo:table-column column-number="5"

column-width="proportional-column-width(2)" />

上の例のカラム幅は次のようになります。

col1 col2 col3 col4 col5

1-1 1-2 1-3 1-4 1-5

表のセルの属性表のセルには、セル単位で次のような修飾ができます。さらに、枠線や間隔については、上下左右の 4

辺に対して個別に設定することができます。

• セル単位で枠線を設定します。• セル単位でバックグラウンド・カラーを設定します。• セルの枠線とテキスト文字列との間の間隔(padding)を設定できます。

表のセルの属性設定<fo:table-and-caption border-style="solid"><fo:table border-collapse="separate" border-separation.block-progression-direction="2pt" border-separation.inline-progression-direction="2pt"><fo:table-body><fo:table-row border-style="dotted" border-width="thin"><fo:table-cell border-style="solid" border-width="thin"><fo:block>1</fo:block></fo:table-cell><fo:table-cell border-style="dotted" border-width="thin"><fo:block>2</fo:block></fo:table-cell><fo:table-cell border-style="dashed" border-width="thin"><fo:block>3</fo:block></fo:table-cell><fo:table-cell border-style="inset" border-width="thin"><fo:block>4</fo:block></fo:table-cell><fo:table-cell border-style="outset" border-width="thin"><fo:block>5</fo:block></fo:table-cell></fo:table-row><fo:table-row><fo:table-cell background-color="red"><fo:block>1-1</fo:block></fo:table-cell><fo:table-cell background-color="blue"><fo:block>1-2</fo:block></fo:table-cell><fo:table-cell background-color="green"><fo:block>1-3</fo:block></fo:table-cell><fo:table-cell background-color="yellow"><fo:block>1-4</fo:block></fo:table-cell><fo:table-cell background-color="blue"><fo:block>1-5</fo:block></fo:table-cell></fo:table-row>

Extensible Stylesheet Language(XSL-FO)解説

- 27 -

Page 28: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

<fo:table-row ><fo:table-cell background-color="pink" border-style="solid" border-width="thin"padding="5pt"><fo:block border-style="solid" border-width="thin" background-color="gray" >2-1</fo:block></fo:table-cell><fo:table-cell background-color="pink" border-style="solid" border-width="thin"padding="5mm"><fo:block border-style="solid" border-width="thin" background-color="gray">2-2</fo:block></fo:table-cell><fo:table-cell background-color="pink" border-style="solid" border-width="thin"padding="3em"><fo:block border-style="solid" border-width="thin" background-color="gray">2-3</fo:block></fo:table-cell><fo:table-cell background-color="pink" border-style="solid" border-width="thin"padding="1cm"><fo:block border-style="solid" border-width="thin" background-color="gray">2-4</fo:block></fo:table-cell><fo:table-cell background-color="pink" border-style="solid" border-width="thin"><fo:block border-style="solid" border-width="thin" background-color="gray">2-5</fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:table-and-caption>

1 2 3 4 51-1 1-2 1-3 1-4 1-5

2-12-2

2-3 2-4

2-5

Extensible Stylesheet Language(XSL-FO)解説

- 28 -

Page 29: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

インラインの FO

文字修飾イタリック、ボールドなどの文字修飾、あるいは、上付き、下付きなどは、インラインの FO を使って指

定します。また、画像もインライン要素である fo:externat-graphic を使って行中に埋め込むことができます。

インラインの FO による文字の修飾<fo:inline font-style="italic">

イタリック</fo:inline><fo:inline font-weight="bold">

ボールド</fo:inline><fo:inline baseline-shift="super">

上付き</fo:inline><fo:inline baseline-shift="sub">

下付き</fo:inline>

上の例は、次のように表示されます。

イタリックボールド上付き下付き

文字の大きさ

fo:inline の font-size プロパティに文字サイズを指定することで文字の大きさを変更することができます。

次の例は、1 文字ごとに font-size の値を 8、10、12、18、24、30、36、42、48 ポイントに設定した例です。

インライン FO による文字の大きさの設定<fo:block text-align="center"><fo:inline font-size="8pt">あ</fo:inline><fo:inline font-size="10pt">あ</fo:inline><fo:inline font-size="12pt">あ</fo:inline><fo:inline font-size="18pt">あ</fo:inline><fo:inline font-size="24pt">あ</fo:inline><fo:inline font-size="30pt">あ</fo:inline><fo:inline font-size="36pt">あ</fo:inline><fo:inline font-size="42pt">あ</fo:inline><fo:inline font-size="48pt">あ</fo:inline></fo:block>

あ あ あ あ あ あ あ あ あ

Extensible Stylesheet Language(XSL-FO)解説

- 29 -

Page 30: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

ルビの表現

fo:inline-container によるルビの表現<fo:inline-container text-indent="0mm"

last-line-end-indent="0mm"start-indent="0mm"end-indent="0mm">

<fo:block font-size="0.5em"text-align="center"line-height="1.3"space-before="-1.3em"space-before.conditionality="retain"wrap-option="no-wrap">

じざいがん</fo:block><fo:block text-align="center"

line-height="1"wrap-option="no-wrap">

自在眼</fo:block>

</fo:inline-container>

上の例は、次のように表示されます。じざいがん

自在眼

Extensible Stylesheet Language(XSL-FO)解説

- 30 -

Page 31: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

脚注

脚注は、脚注を付けたい文字の後ろに fo:footnote を設定します。fo:footnote-body に脚注の本文を設定します。

fo:footnote と fo:footnote-bodyによる脚注の設定<fo:block text-indent="1em"

space-before="0.6em"space-after="0.6em"start-indent="10mm"end-indent="10mm"text-align="justify">

<fo:inline font-weight="bold">「Extensible Markup Language」(XSL-FO)仕様

<fo:footnote><fo:inline baseline-shift="

super" font-size="75%">(1)</fo:inline>

<fo:footnote-body><fo:block background-color="antiquewhite"

start-indent="10mm"end-indent="10mm">

<fo:inline baseline-shift="super"font-size="75%">

(1)</fo:inline>

XSLスタイルシートという言葉は、現在、非常に混乱しています。「Extensible Stylesheet Language」仕様は、当初、XSLT(変換言語)、XPATH(パス指定方法)と一緒に検討されていました。ところが、1999年 4月に XSLT、XPATHが独立して別仕様になったこと。Internet Explorerが、独自仕様の XSLスタイルシートを使って XMLを HTMLに変換して表示するようになっているなどが原因です。</fo:block></fo:footnote-body>

</fo:footnote>は、このような要請に応えることができます。</fo:inline>

</fo:block>

「Extensible Stylesheet Language」(XSL-FO)仕様(1)は、このような要請に応えることができます。

(1)XSL スタイルシートという言葉は、現在、非常に混乱しています。「Extensible StylesheetLanguage」仕様は、当初、XSLT(変換言語)、XPATH(パス指定方法)と一緒に検討されていました。ところが、1999 年 4 月に XSLT、XPATH が独立して別仕様になったこと。Internet Explorer が、独自仕様の XSL スタイルシートを使って XML を HTML に変換して表示するようになっているなどが原因です。

Extensible Stylesheet Language(XSL-FO)解説

- 31 -

Page 32: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

索引や目次の作成方法

索引や目次の項目に fo:page-number-citation を使ってページ番号を引用したり、リーダをつけることができます。

ページ番号を入れたい箇所に fo:page-number-citation を置き、そのプロパティref-id に参照先項目の ID 番号を付けます。また、本文の中の該当項目には、fo:inline のプロパティとして ID 番号を付けます。

リーダは fo:leader によって設定します。 leader と fo:page-number-citation が配置される fo:block に text-align-lastjustify を設定して置くことでページ番号を行末揃えし間をリーダで埋めることがでできます。

fo:page-number-citation と fo:leader の設定<fo:block space-before="2em"

start-indent="10mm"end-indent="10mm"text-align-last="justify">

目次・索引に指定する項目<fo:leader leader-pattern="dots"/><fo:page-number-citation ref-id="XYZ0211"/>

</fo:block>

<fo:block space-before="2em"start-indent="10mm"end-indent="10mm">

本文・・・・・・・・・・・・・・・・・・</fo:block><fo:block start-indent="10mm"

end-indent="10mm">・・・・・・・・・・・・・・・・・・・・</fo:block><fo:block start-indent="10mm"

end-indent="10mm">・・・・

<fo:inline id="XYZ0211">目次・索引に指定する項目</fo:inline>・・・・

</fo:block><fo:block start-indent="10mm"

end-indent="10mm">・・・・・・・・・・・・・・・・・・・・</fo:block>

上の例は、次のようにフォーマットされます。

目次・索引に指定する項目.........................................................................................................................32

本文・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・目次・索引に指定する項目・・・・・・・・・・・・・・・・・・・・・・・・

Extensible Stylesheet Language(XSL-FO)解説

- 32 -

Page 33: Extensible Stylesheet Language (XSL-FO)解説...XSLT とは?XSLT というのは仕様の名前です(1)。XSLT は、もともと、ソースXML 文書をXSL-FO 文書に変換するために設計された仕様です。これは

付録

XSL 仕様小史

XSL という言葉は、現時点では非常に混乱しています。その理由を理解するには、XSL 仕様の歴史を知る必要があります。そこで、XSL 仕様の歴史を簡単にまとめてみます。

スタイルシート(XSL)の仕様は、1997 年 8 月に、Microsoft、Inso、Arbortext から W3C に提案されました。提案時の仕様案である「A Proposal for XSL」は、現在とはまったく違うものです。

初期の「Extensible Stylesheet Language」ドラフト仕様では、前段が XSL-FO を作成するための変換言語(XSLT)、後段が XSL-FO の仕様から構成されていました。XSLT 仕様は XSL-FO を作成するための仕様として設計されたのです。

ところが、1999 年 4 月に「Extensible Stylesheet Language」ドラフト仕様は、「XSL Transformations」(XSLT 仕様)、「Extensible Stylesheet Language」(この解説書で XSL-FO と略記する仕様)の 2 つの仕様に分離しました。

さらに、XSLT 仕様は、同年 7 月に XSLT 仕様と「XML Path Language」(XPath 仕様)に分離しました。

そして、XSLT、XPath 仕様の方が一足先に、1999 年 11 月に W3C 勧告になりました。

当初から Microsoft は、InternetExplorer で XML を表示する手段として、XSLT/XPath 仕様に積極的に取り組んでいました。Microsoft は、現在、W3C 勧告版の XSLT/XPath 仕様を実装したプロセサ MSXML3.DLLを同社のホームページから無償で配布しています。これを InternetExplorer と共に使えば、XML を XSLT プロセサで HTML+CSS に変換することによって、Web ブラウザで XML を表示する手段として利用することができます。さらに、今では、XSLT プロセサは、HTML や XSL-FO の生成に限らず、汎用の XML 変換用に幅広く使われるようになりはじめています。

しかし、Microsoft は XSL-FO 仕様の方には熱心でないようです。最初の提案社の中で XSL-FO 仕様に取り組んでいるのは、Arbortext の方と思われます。

Extensible Stylesheet Language(XSL-FO)解説

- 33 -