テーブルを出力するのとページまたがりになる場合があります.テーブルがそれほど大きくなくとも、本文の量によってあるものは1ページに収まり、あるものはページにまたがります.一般にページまたがりはいやがられるのですけれど、テーブルによってはもともと1ページに収まらないものがあります.HTMLならスクロールしさえすればいいのですが、PDFだとそうはいきません.そこでよくお客様から出る要望に、最初のページ以降にもテーブルのタイトルを出して末尾に「続き」(Continued)と加えて欲しいというものがあります.
XSL-FOではそのようなことに対応できるのでしょうか?はい!できます.それはfo:retrieve-table-markerとfo:markerを組み合わせて使えば実現できるはずなのです.
6.13.7 fo:retrieve-table-marker
http://www.w3.org/TR/xsl/#fo_retrieve-table-marker
http://www.w3.org/TR/xsl/#fo_retrieve-table-marker
と言ってみたのですが実は会社のWEBにはこういう例は載っていません.そもそもfo:retrieve-table-markerでWEBをあたってみてもあまりサンプルはないのです.分割されたテーブルの下に"Continued"と出す例はあるのですけど、次のページの分割されたテーブルの表題に例えば"Table 2-12-2. Formatting options (Contined)"などと出す例は、カナダのCrane SoftwrightsのG. Ken HollmanさんのW3Cメーリングリストへのポストくらいです.(Hollmanさんは、XSL-FOの本も出しているとても紳士的で有名な方です.)
RE: Adding continued to table header if goes more than one page
http://lists.w3.org/Archives/Public/www-xsl-fo/2011Feb/0000.html
http://lists.w3.org/Archives/Public/www-xsl-fo/2011Feb/0000.html
やり方は、ここにHollmanさんが言われているように、fo:table-headerにfo:retrieve-table-markerを書き、最初のfo:table-bodyのfo:row/fo:table-cellに空のfo:markerを、次の行のfo:row/fo:table-cellに"(Continued)"というインラインを含むfo:markerを書いてやります.そうすると最初のテーブルの表題は普通どおりに出て、次のページのテーブルの表題には"(Continued)"と出てくれます.
これをPDFにしたイメージは次のとおりです.確かに2ページ目には"(Continued)"と出ています.
このFOとPDFは以下からダウンロードできます.
TableContinued_03.fo
http://yahoo.jp/Mah7lT
http://yahoo.jp/Mah7lT
TableContinued_03.pdf
http://yahoo.jp/8ZlpJx
http://yahoo.jp/8ZlpJx
「なんだ、できるじゃん」と思われましたか?それとも「できているみたいだけど、ちょっとこのテーブルは罫線が抜けてない?」と思われましたか?後者に気がつかれた方はサスガです.
実はこのテーブルのオーサリング元はDITAです.DITAはCALSのテーブル使ってます.で、そのまま結果を加工するとこのようにならざるを得ないのです.原因は、テーブルのタイトルを分割されても繰り返し表の上に現われるように、fo:table-captionに入れるのではなく、fo:table-header/fo:table-row/fo:table-cellに入れているからなのです.
CALSのテーブルモデルでは、table/@frameにテーブルの一番外側の罫線を指定します.frame="all"だったら外側は全部罫線で囲まれます.これをだんだん下の階層まで落としてゆくと、entry/@colsep="1"は「セルの右側」に罫線を引きます.entry/@rowsep="1"は「セルの下側」に罫線を引きます.
ですので、@frame="all"をそのまま適用すると、このテーブル実は次のようになってしまいます.なんとタイトルの上に罫線が引かれてしまうのです.
これではたぶんお客様はOKとは言ってくれないでしょう.
ではどうするかです?ちょっと考え込んでしまいました.fo:table-headerでfo:retrieve-table-markerが書けるのは、XSL-FOの仕様からすると素直です.fo:table-headerやfo:table-footerはページまたがりで必ず繰り返し表示されるからです.しかしCALSの仕様からXSL-FOのテーブルに展開してゆく立場からすると、どうにも使えないのです.
いえ、やろうとすれば(頑張れば)出来るのでしょうけれども、DITA→XSL-FOのスタイルシートではただ"(Continued)"と出すためだけに、すごいスタイルシートの発想を転換して泥臭いことをやらねばなりません.table/@frameが指定されたときに、テーブルの上外側に引く罫線は、fo:table/fo:table-header/fo:table-row[1]の下罫線に反映させねばなりません.テーブルの左と右に引く罫線は、fo:table/fo:table-header/fo:table-row[1]の左右の罫線を除外して反映させねばなりません.
WEBにあまり例が載っていない理由もわかります.XSL-FOで例は示せても、スタイルシートを作れといわれるとなかなか大変だからです.世の中簡単なようでいざ実現するとなると大変である一例ですね.