fo:page-sequenceの調停(2)

ページシーケンスの調停に使用するのはオープンソースで公開されているカナダのG.Ken Holmanさんのpsmi.xslというスタイルシートです.

Page Sequence Master Interleave (PSMI)

HollmanさんはXSLとXSLTで著名な方で本も出しておられます.

Definitive XSL-FO

このスタイルシートXSLT + XSLの世界では結構有名で使っている例があちこちで紹介されています.このスタイルシートは、XSLT 1.0で書かれていますが、ほぼそのままで問題なく動きます.仕組みはいたって簡単で、

<fo:page-sequence master-reference="A4のページマスター">
  <!-- backmatter1.xml~backmatter2.xmlのコンテンツ-->
</fo:page-sequence>
<fo:page-sequence master-reference="A4/二段組のページマスター">
  <!-- 索引のコンテンツ-->
</fo:page-sequence>
<fo:page-sequence master-reference="A4のページマスター">
  <!-- backmatter3.xml~chapter4.xmlのコンテンツ-->
</fo:page-sequence>

というページシーケンスを作りたければ、psmiというプリフィックスhttp://www.CraneSoftwrights.com/resources/psmiのネームスペースを宣言しておき、

<fo:page-sequence master-reference="A4のページマスター">
  <!-- backmatter1.xml~backmatter2.xmlのコンテンツ-->
  <psmi:page-sequence master-reference="A4/二段組のページマスター">
    <!-- 索引のコンテンツ-->
  </psmi:page-sequence>
  <!-- backmatter3.xml~chapter4.xmlのコンテンツ-->
</fo:page-sequence>

というページシーケンスをいったん作ります.ここでpsmi.xslを通過させると望みの

<!--①-->
<fo:page-sequence master-reference="A4のページマスター">
  <!-- backmatter1.xml~backmatter2.xmlのコンテンツ-->
</fo:page-sequence>
<!--②-->
<fo:page-sequence master-reference="A4/二段組のページマスター">
  <!-- 索引のコンテンツ-->
</fo:page-sequence>
<!--③-->
<fo:page-sequence master-reference="A4のページマスター">
  <!-- backmatter3.xml~chapter4.xmlのコンテンツ-->
</fo:page-sequence>

が出来上がってくれます.ただし条件があって、psmi:page-sequenceは必ずfo:page-sequenceの子要素でなければなりません.深い階層のpsmi:page-sequenceは上位にまで引き上げられないからです.あとはfo:page-sequenceをいわば分割して途中にfo:page-sequenceを作るので、①のfo:page-sequenceのinitial-page-numberプロパティがautoでない、つまり親のページシーケンスが特定のページ番号から始まっていても、②と③のinitial-page-number属性はautoにしてくれます.こうしないとつじつまが合わなくなってしまうからです.でももし②の前にコンテンツがなくて最初にpsmi:page-sequenceが現れた場合はそのinitial-page-numberの値を継承します.

このあたりは実際にどのような場合にページシーケンスの調停を取るかでいろいろとカスタマイズが必要でしょう.

私もこのスタイルシートには非常にお世話になっています.DITAでbooklists/indexlistを二段組みでやろうとしたらほぼ必須のアイテムと言って過言ではないでしょう.