Article Information


JATS組版:3つ数えるくらい簡単


概要

JATSプレビュー用スタイルシートはXSLT 1.0で書かれている。この論文は、政府機関の報告書に使用されるXSLT 1.0スタイルシートをカスタマイズする方法、オンラインジャーナル用の記事を処理するためのXSLT 2.0スタイルシートを適応させる方法、またXSLT 3.0技術のたたき台としてスタイルシートをXSLT 3.0にアップグレードする、というアプローチについて述べる。

U.S. National Library of Medicine (NLM)(米国国立医学図書館)のNational Center for Biotechnology Information(国立生物工学情報センター)が提供するXSLT 1.0 “NISO Journal Article Tag Suite (JATS) version 1.0” スタイルシートはGitHubで入手可能である。このスタイルシートは、「スタイルシートを一から作成するのが難しいJATSユーザへの出発点」として提供される。特に、スタイルシート管理者はこのスタイルシートをソリューション自体ではなく、カスタマイズしたソリューションのためのテンプレートとして見なしており、見栄えのカスタマイズに関わる変更は受け付けないと明記されている。

にも拘わらず、このスタイルシートは生産システムでJATSと共にXSLTを使う最初のステップとして役に立つ。この論文では、XSLT 1.0、2.0、3.0と共にこのスタイルシートを使った経験を述べる。

XSLT 1.0を使おうと決めた場合、最良のアプローチはできるだけオリジナルのスタイルシートに手をつけないで残そうとすること。そして、代わりに、オリジナルのスタイルシートをインポートし、オリジナルのテンプレートルールを上書きするカスタマイズ用スタイルシートを書く。これは、正確なフォーマット出力を達成するのに必要である。必然的に、オリジナルにはいくつか上書きする必要のある部分がある。この論文では、プロジェクト上変更が必要だった部分を補う方法を取り上げる。

XSLT 2.0用にこのスタイルシートを適応させる場合、XSLT 2.0プロセッサーで処理することは長い道のりにはなるが、ただversion属性を変更するだけで可能である。しかし、XSLT 2.0の特別な機能、たとえば、属性ノードのシーケンスをテンプレートパラメータとして渡すことができる機能などは、出力をカスタマイズする可能性の範囲をより広げてくれる。そう考えれば、XSLT 1.0プロジェクトで、オリジナルのスタイルシートに手を加えないアプローチをするよりは、変更を必要なだけ加える方が好ましい。この論文では、ジャーナル記事を処理するためのスタイルシートをカスタマイズする際に行なった、XSLT2.0特有の変更を詳述する。

XSLT 3.0は全く新しい舞台であり、XSLT 3.0のたたき台プロジェクトはGitHubで公開されている。中型サイズのXSLT 3.0プロジェクトで、我々がもっともよく行っている(X)HTML(5)やXSL-FOへの変換におけるXSLT 3.0新機能を試したり、その途中で、高次元の機能や、部分関数アプリケーションを使って、あるいは他のXSLT 3.0の優れた機能を使って変換を行うための新しいデサインパターンに出くわしたりするのかもしれない。このプロジェクトは、JATSプレビュー用スタイルシートからスタートした。それは扱うのに大きすぎず、小さすぎて現実的でないということもなかったからである。この論文はJATSプレビュー用スタイルシートにXSLT3.0の機能を適用するための現状の変更とメリットについて論ずる。


JATSプレビュー用スタイルシート

U.S. National Library of Medicine (NLM)(米国国立医学図書館)[7]の National Center for Biotechnology Information (NCBI)(国立生物工学情報センター)[6] が提供する The XSLT 1.0 "NISO Journal Article Tag Suite (JATS) version 1.0" stylesheets [5] はGitHubで入手可能である。このスタイルシートは、「スタイルシートを一から作成するのが難しいJATSユーザへの出発点」として提供される。

パッケージ一式はJATSからHTMLへ変換用のXSLTスタイルシート、PDF出力用のXSL-FO変換用のXSLTスタイルシートなどを含み、またOASISの表からHTMLの表への変換時などの前後処理に使われるさまざまなXSLTスタイルシートやXProcパイプラインなどを含む。プレビュー用スタイルシートで使えるよう、異なるフォーマットを列記し、異なるメディアへの出力を最適化している。この論文に書かれているプロジェクトではどれも変換の前後処理を必要としていないので、ここではそれを取り上げていない。

XSLT 2.0が2007年にW3C勧告となったにも関わらず、2012年付けでJATSプレビュー用スタイルシートがXSLT 1.0で書かれたのにはいくつかの理由がある。

  • XSLT 1.0はいくつかのプラットフォーム上ではまだ主要なXSLTのバージョンである。例えば、マイクロソフトは、.NetではXSLT 1.0のみのサポートしている。(サードパーティーのプロセッサーは利用可能だが) また、xsltprocはいまだにLinux/Unix系では主要なXSLTプロセッサーである。

  • XSLT 1.0スタイルシートは、ほとんどすべての場合、XSLT 2.0プロセッサーで同様に作用する。現行のスタイルシート中のコメントには、スタイルシートはXSLT 1.0およびXSLT 2.0プロセッサーで動作確認済みと明記してあり、そしてXSLT 1.0構造がXSLT 2.0プロセッサーで適切に処理されるよう少なくとも一つの変更が加えられている。

  • JATSプレビュー用スタイルシートは、XSLT 2.0より以前の、NLMドキュメント処理のための初期スタイルシートを発展させたものである。現行のスタイルシート中のコメントには、2004年に行われた初期の設計について言及してあり、また、私が認識する限り最も初期のNLMスタイルシート[22]は2006年からであるが、そこには2004年9月のオリジナルの作成日について引用している。JATSプレビュー用スタイルシートの再構築したスケジュールを図 1に示す。

図 1

スタイルシートの対照年表はコード内のコメント、ダウンロード、またNCBIのKim Tryka氏、Mulberry TechnologiesのB. Tommie Usdin氏とのEメールによって、再構築した。

timeline.png

JATSプレビュー用スタイルシートと初期のNLMスタイルシートはMulberry Technologies, Inc.によってNCBIのために開発された。

図 2に示すように、スタイルシートの出力はスタイリッシュというよりは機能重視型である。

図 2

中核のJATSプレビュー用スタイルシートで組版したこの論文の原稿

jats-preview.png

カスタマイズ性

JATSプレビュー用スタイルシートの管理者は、スタイルシートからの出力をカスタマイズするにあたって、明確な方針を持っている(強調表示):

このスタイルシートは、スタイルシートを一から作成するのが難しいJATSユーザへの出発点として提供される。JATSには様々な導入の仕方があるので、このスタイルシートがどんなシステム上でも実運用にすぐ使えるファイルになるだろうという期待を持ってはならない。その代わりに、スタイルシートを固有の用途に合うようにカスタマイズすべきものである。

スタイルシートをソリューション自体ではなく、カスタマイズしたソリューションのためのテンプレートとして見なしているので、実際のバグ修正は受け付けるが、カスタマイズするための変更はマージしない。例えば、修正しなければ最終の出力結果が失敗に結びつくような問題は、修正を受け付ける。しかし、最終の出力結果の見た目の印象 (フォント変更、マージン変更、画像サイズなど) に焦点を置いた変更は受け付けない。

これは、他の標準ドキュメントタイプ、例えば様々なフォーマットでの出力を変更するため数百もの設定ができるなど [20]、標準スタイルシート[18]、を提供しているDocBook[17]やTEI[19] のようなタイプとは対照的である。

計画的に、すべての可能なスタイルの組み合わせに対応しないということは、JATSプレビュー用スタイルシートが他の人がスタイルシートをカスタマイズするのをサポートしないというわけではなく、スタイルシートをカスタマイズした出力のベースとして使うのをやめさせているわけでもない。上記の、GitHubのプロジェクトのページからの引用は、人々がカスタマイズ用の基礎として提供されるスタイルシートを使用するだろうというスタイルシート管理者の期待を示している。加えて、そこには、XSLTがどのように作用するか、そしてカスタマイズを簡単にするスタイルシートがどのように書かれたかという側面がある。

カスタマイズを支援するXSLTの機能

XSLT設計において特にカスタマイズに貢献する3つの特徴とは、モジュラースタイルシートのサポート、テンプレートとしての構成、そして名前付き属性セットである。

モジュラースタイルシートのサポートはxsl:includexsl:importがXSLT1.0の最上位要素なので、XSLTの機能の一部である。仮に今までにそういったものに遭遇したことがなくても、その名前から、他のスタイルシートの一部として一つのスタイルシートを使うものだろうと想像できるであろう。xsl:includeは、確かに、概念的に1つのスタイルシートの内容を他のスタイルシートの内に含む。一方xsl:importは、インポートされる側のスタイルシートの内容をインポートする側のスタイルシートへ十分に定義された規則で利用可能にする。その規則とはインポートする側のスタイルシートの内容がインポートされる側のスタイルシートの内容より優先するというものである。

中核のJATSプレビュー用スタイルシートは図 3が示すように、xsl:includeのみを用いる。

図 3

JATSプレビュー用スタイルシートにインポート・インクルード

imports-jats.png

XSLTスタイルシートの構成は、ソースドキュメントの固有の文脈に一致させるxsl:template規則が優勢だが、それにより、固有の文脈に一致するテンプレートを含んだインポートする側のスタイルシートを書くのを容易にしている。例えば、次のテンプレートは td要素を処理するのに用いる。文字どおり、fo:table-cell は結果にコピーされる。xsl:call-templateは、XSLTネームスペースにあるすべての要素と同様に、XSLTプロセッサによって動作する。

<xsl:template match="td">
  <fo:table-cell xsl:use-attribute-sets="td">
    <xsl:call-template name="process-table-cell"/>
  </fo:table-cell>
</xsl:template>

インポートの優先度についての規則は、中核JATSプレビュー用スタイルシート中の対応するテンプレートを上書きしてカスタマイズするのを容易にする。だが、それは、テンプレートを上書きすることが理想的なメカニズムであることを意味しない。例えば、大きな複雑なテンプレートに小さな修正をしたい場合、普通は、単に元のテンプレートの小部分を上書きするのではなく、修正を含めた大きなテンプレートのコピーを維持しなければならない。しかし、一般的な場合、インポートされる側のテンプレートを上書きするのは、うまく作用する。

名前付き属性セットは、使用されるごとに新たに評価される属性定義のグループである。また、結果として生じる属性は、XSLT変換結果の要素に加えられる。複数の名前付き属性セットを同名で組み合わせる規則や、複数の異なった属性セットを組み合わせる規則はインポートする側のスタイルシートを引数にしたり、中核のJATSプレビュー用スタイルシートの属性セットを上書きすることを容易にしている。

カスタマイズを支援するJATSプレビュー用スタイルシートの機能

JATSプレビュー用スタイルシート設計において特にカスタマイズに貢献する3つの特徴とは、フォントファミリ用のグローバル変数、名前付き属性セット、名前付きテンプレートを使うことである。間違いなく、これらはすべて、JATSプレビュー用スタイルシートに存在し、スタイルシートがカスタマイズをサポートするよう意図されているかどうかに関わらず、その特徴は "Every piece of knowledge must have a single, unambiguous, authoritative representation within a system (知識のすべてはシステム内で、単一で明確で信頼できる表現でなければならない)" の中にある"Don’t Repeat Yourself (DRY, 繰り返さない)" 主義[21] を具現化している。例えば、次の様な事項である:

  • フォントファミリーは一旦、変数に定義される。

  • 変数は、名前付き属性セット中の属性定義内も含め、多数の箇所で使用される。

  • 名前付き属性セットは、スタイルシート内の一つまたは複数の文脈で使用され、そして

  • 名前付きテンプレートは共通の処理を一つに閉じ込めるので、多数のテンプレートのいたるところで繰り返されることはない。

スタイルシートを構築する方法としては、カスタマイズするスタイルシートの中の信頼性のある表現を上書きし、または再使用することができるので、メンテナンスが容易で、カスタマイズも容易にできる。

例えば、次のセクションで書かれているXSLT 1.0スタイルシートは次の2つの名前付き属性セットの定義およびテンプレートを含んでいる。

<xsl:attribute-set name="td">
  <xsl:attribute name="line-stacking-strategy">max-height</xsl:attribute>
</xsl:attribute-set>

<xsl:attribute-set name="td-small" use-attribute-sets="td">
  <xsl:attribute name="line-height">10pt</xsl:attribute>
  <xsl:attribute name="border">none</xsl:attribute>
  <xsl:attribute name="padding-top">0pt</xsl:attribute>
  <xsl:attribute name="padding-bottom">0pt</xsl:attribute>
</xsl:attribute-set>

<xsl:template match="td[ancestor::table[@style = 'small']]">
  <fo:table-cell xsl:use-attribute-sets="td-small">
    <xsl:call-template name="process-table-cell"/>
  </fo:table-cell>
</xsl:template>

「td」名前付き属性セットはメインのJATSプレビュー用スタイルシートで定義されている。従って、この定義はその定義に加えられる。また、結合された属性セットは「td」属性セットが使われるところではどこでも評価される。例えば、通常より狭いスペースに組版する表で使用する、「td-small」名前付き属性セットの内などである。このような表内のtdのテンプレートはその名前付き属性セットを使用する。そしてその名前付き属性セットは「td-small」属性セットのすべての属性と、「td」属性セットの定義から来るすべての属性を変換結果のfo:table-cellに追加する。表のセルを組版する共通の解釈を扱うコアなJATSプレビュー用スタイルシートから「process-table-cell」テンプレートを使うことが可能なので、このテンプレートは他のことをあまり行わない。

XSLT1.0カスタマイゼーション

2012年に行われた、JATS青版(Blue)マークアップのバリエーションを使う文書を組版してPDFにするプロジェクトでは、カスタマイズ作業はコアJATSプレビュー用スタイルシートをインポートするXSLT 1.0スタイルシート開発であった。その理由は:

  • ユーザはXSLT 1.0を好んでいる。

  • bodybackマークアップはJATSから変わっていない。

  • ページデザインがJATSプレビュー用スタイルシートの出力に、部分的に、基いている。

  • 中核スタイルシートに大部分は手をつけないでおくことにより、中核スタイルシートをその都度アップデートするのが容易になる。

図 4が示すように、組版結果はJATSプレビュー用スタイルシートの出力といくらか類似性を保っている。

図 4

XSLT 1.0のカスタマイズで組版した論文原稿

xslt10.png

JATSプレビュー用スタイルシートへの変更

変数名のタイポの修正は別として、唯一の変更は、中核スタイルシートが10個のテンプレートで start-indent プロパティを既に指定していたところに end-indent プロパティの指定を追加したことである。他のテンプレートの修正したコピーは、カスタマイズ用スタイルシートに入れているが、もしそれにさらに10個の比較的大きいテンプレートをコピーし、たった一つのプロパティ(end-indent)をそれぞれに追加したなら、カスタマイズ用スタイルシートを増大させ、わかりにくくし、またわずかな利点のために維持を困難にしてしまっただろう。

修正をできる限り少なくすることで、NCBIが新バージョンをリリースするたびに、中核のJATSプレビュー用スタイルシートのプロジェクトのコピーの改定が容易になるに違いない。

インポート構造

最も単純かつ一般的な構造は、プロジェクトのカスタマイズ用スタイルシートが中核のJATSプレビュー用スタイルシートをインポートすることであろう。しかし、図 5が示すように、プロジェクトの最上位スタイルシートが2つのMathML関連のスタイルシート、プロジェクトのカスタマイズ用スタイルシート、そして中核JATSプレビュー用スタイルシートをインポートしている。2つのMathML関連のスタイルシートは、次の2つの非関連な問題に代替手段を供給するためにカスタマイズ用および中核スタイルの両方を上書きしている:

  • ディスプレイ数式内にある数式番号ラベルは括弧でその番号を括る必要があった。

  • FormatterエンジンのMathML処理で、mml:mo要素の連結文字を一つの内容とした連結文字として正確に配置されなかった。従って、問題の文字列は見栄えを良くするため、他の文字列に変換された。[1]

代替手段は両方とも単純である。しかし、それらは個別のスタイルシートとして実装されている。従って、それらがもはや必要でなければ、一旦各々を削除するのに単にトップレベルのスタイルシートの対応するxsl:importを削除することが要求される。もし代替手段をプロジェクトのカスタマイズ用スタイルシートに組み入れていれば、より少数のXSLTファイルで良いことになっただろうが、それは各代替手段を取消すより仕事量は多くなったかもしれない。

図 5

XSLT 1.0のカスタマイズにおけるインポート

imports-xslt10.png

カスタマイズ用スタイルシート

図 6が示すように、主カスタマイズ用スタイルシートをコードの行でみるとおよそ次の構成である:

  • 7%は、導入のコメント

  • 18%は、中核スタイルシートからの変数と属性セットの上書き

  • 5%は、新しいテンプレートで使う新しい属性セット

  • 15%は、トップレベル要素を扱う中核スタイルシートにあるテンプレートを上書きしたテンプレート

  • 15%は、JATS以外のメタデータから作られる表紙を作成するテンプレート

  • 35%は、リスト、表、図表、相互参照表などの下級レベルのテンプレートで、新規の物もあれば、中核スタイルシートのテンプレートを変更したものもある。

  • 5%は、PDFのしおり用のテンプレート

図 6

XSLT 1.0カスタマイズ用スタイルシートの構成

xslt10-customisation-chart.png

ベンダー独自の拡張機能

ベンダー独自の拡張機能はXSLTの処理では使われなかった。

唯一XSL-FO処理で使われた拡張機能はMathML対応であった。XSL-FO組版ソフトがMathMLに対応すると当然期待するだろうが、MathMLはXSL 1.1では必須ではない。従って、厳密に言えば、MathML対応はベンダーの拡張なのである。

XSLT2.0カスタマイズ機能- PLOS ONE

PLOS ONE (PONE) [24]は、国際的な、査読済みの、閲覧可能なオンライン出版物で、アメリカ、カリフォルニアのサンフランシスコに本部を置く非営利の権利擁護団体、PLOS (Public Library of Science)[23]によって、公表された。

PLOS ONEはWord、LaTeXあるいはRTF形式の原稿を受け取り、次にこれを出版するに先立ってNLM Journal Publishing DTD v3.0に準拠したXMLに変換して作成する。

PLOS ONEの記事は二段組ページで組版される。ソースのXMLにサイズの情報がないので、図表は、段の幅かページ幅で、表も段の幅かページ幅に置き、ページの高さになるよう回転させる場合もある。図表と画像はページあるいは段の上部か下部にフロートさせる場合もある。

2013年のPLOS ONEの既存のスタイル[25]をXSL-FOを使って複製するプロジェクトで、カスタマイズ用スタイルシートを使うより中核のスタイルシートを修正することに決定した。その理由は以下の通りである。

  • PLOS形式のメタデータを示して、図表と表を扱い、記事の異なる部分での二段組と一段組の見栄えの差を、別のカスタムスタイルシートを使用して変更を加えるのに、以前のプロジェクトで行われたものを使うより、中核スタイルシートの複製の方が良いだろう。

  • デフォルト組版からの変更の分量から判断して、JATSプレビュー用スタイルシートに加えられる改定をピックアップしても、このプロジェクトではあまり恩典はないだろう。

中核スタイルシートが広範囲に修正されるので、XSLT 2.0にアップグレードした。その理由は以下のとおりである。

  • XSLT 2.0スタイルシートはその同等のXSLT 1.0スタイルシートより一般的により簡潔である。

  • XSLT 2.0およびXPath 2.0は、XSLT 1.0およびXPath 1.0より利用可能な機能の総合ライブラリを持つ。

  • XSLT 2.0は強力な型のチェック機能を持っていて、間違った型のパラメータを渡したときなど、自分でチェックできる。

図 7が示すように、組版結果は中核のJATSプレビュー用スタイルシートによる出力と類似性は非常に少ない。同様の結果はXSLT 1.0だけで得られたかもしれないが、XSLT 2.0で行う方が簡単と考えられる。

図 7

XSLT 2.0のカスタマイズで組版したこの論文の原稿

xslt20.png

XSL 1.1の機能

XSL 1.1は、ページの「before-float-reference-area」を定義するが、ページの「after」側にフロートする内容エリアと「before-float-reference-area」にフロートする内容エリアを定義していない。インスタンスを作成した時、ページの 「fo:region-body」の全幅を取る。

従って、PLOSは、XSL 1.1で定義されているよりも多様なfloatに対応するためにベンダー独自の拡張機能を搭載したXSLの組版ソフトを選択せざるを得なかったのである。

処理モデル

PONE文書を処理するためのブロック図を、図 8に示す。

図 8

Processing block diagram

pone-processing-full.png

画像処理

画像は少なくとも固有のサイズを持っており、TIFFのような形式では、同様に固有解像度を持っている。

画像を段幅にするか、ページ幅にするかを判断する過程は以下の通りである。

  • PLOS ONEのウェブページからTIFF画像のコピーをダウンロードする。

    実用では、PLOSは画像をサーバーで利用可能にしておくであろうから、これはスタイルシートを開発する期間に単に必要な作業である。

  • ImageMagickの「identify」コマンドを使って各画像の幅、高さ、水平の解像度、垂直の解像度の情報を得て、identifyファイルにその情報を書き込む。

  • XSLTスタイルシートで一つの画像を処理する場合、unparsed-text()を使って、対応する「identify」ファイルの内容を入手し、4つの値を得るために返された文字列をトークン化する。そして、ピクセル値の幅を水平解像度で分割することで画像の幅を計算する。計算された幅の値がカラム幅以下だったらカラム幅になり、そうでなければページ幅になる。

PLOS ONEオーサリングガイドラインは、画像サイズはページ本体の高さまで許容している。だが、図表は300文字以内のキャプションが付与されるだろうし、組版結果にはさらにラベル、タイトル、DOI (Web上の電子文献と一対一に対応しているコード)も出現する。XSLはフロートさせたFOがページを跨ぐことを許容していない。下記の表について述べていることと似ているが、処理システムは両方の幅で図表キャプションを「あらかじめフォーマットし」、スタイルシートによって画像の許容範囲の最大高を縮小するように、メインのスタイルシートが入力として使用するエリアツリーを書き上げる。これで、画像がキャプションをフッタエリアに押し出さないようにする。

表の処理

表は上記で述べたが、表の内容がどれにべストフィットするかによって、カラム幅、ページ幅あるいはページの高さのどれかで配置される。どれに決めるかは全面的に処理システムが行う。XMLは他のソースから変換されたそのままの状態で、DTDで定義された見栄え志向の属性さえも含んでいないからである。

NLM/JATS DTD [26] は結合された表とキャプションの位置方向の指定に対応しているが、表の幅を示す方法を提供していない。一方NISO JATSの表モデルはtablecaptionには「style」属性を許容しており、その両方を含むtable-wrapにではない。

プロジェクトスタート時に提供されたサンプルファイルには、画像用のTIFFファイルと同様にサンプル中にある表の各々のTIFF画像が含まれていた。表のイメージは既存のページレイアウトシステムが生成した人工物であり、それらが入手可能になる見込みはないのみならず、FOベースの新システムでも同様なものの生成が期待されていることが明らかになったのはプロジェクトが始まってからであった。

実装したアプローチでは、各表を各幅で含む組版済みの仮のサイズ調節文書(sizer)を作る。その文書をXMLでエリアツリーとして保存する。そして、最終組版用のFOを生成するスタイルシートへのパラメータとしてエリアツリーを提供している。

サイズ調節文書は各々違う固定の幅と大きな高さの3つのページシーケンスから成る(組版ソフトがfo:root media-usage="bounded-in-one-dimension">に対応していないため)。ソースXMLにある表はそれぞれIDを持っている。各ページの表には、表の独自のIDの前にページに特有の接頭辞を付け加えることによって、FO文書内でユニークなIDを与えられる。図 9はページ幅、カラム幅、ページ高さの幅で組版した表を示す。最初の二つの表はカラム内に収まっているが、三番目はカラムからはみだし、ページの幅にあっていない。

図 9

サイズ調節文書(sizer document)

sizer.png

サイズ調節文書を作るスタイルシートはとても簡単である。文書ノードにマッチするテンプレートがすべての作業を行う。そして、表が最終出力で期待通りになるように、そのスタイルシートがメインのスタイルシートをインポートする。ただ3つのページ種類があるだけなので、スタイルシートは頁並びのマスターさえも定義する必要はなく、fo:page-sequenceが直接fo:simple-page-masterを参照するだけである。

  <fo:root>
    <fo:layout-master-set>
      <xsl:call-template name="define-sizer-simple-page-masters"/>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="page-wide">
      <fo:flow flow-name="body" xsl:use-attribute-sets="fo:flow">
        <xsl:apply-templates select="//table-wrap">
          <xsl:with-param name="prefix" select="'page-wide-'" as="xs:string" tunnel="yes" />
        </xsl:apply-templates>
      </fo:flow>
    </fo:page-sequence>
    <fo:page-sequence master-reference="column-wide">
      <fo:flow flow-name="body" xsl:use-attribute-sets="fo:flow">
        <xsl:apply-templates select="//table-wrap">
          <xsl:with-param name="prefix" select="'column-wide-'" as="xs:string" tunnel="yes" />
        </xsl:apply-templates>
      </fo:flow>
    </fo:page-sequence>
    <fo:page-sequence master-reference="page-high">
      <fo:flow flow-name="body" xsl:use-attribute-sets="fo:flow">
        <xsl:apply-templates select="//table-wrap">
          <xsl:with-param name="prefix" select="'page-high-'" as="xs:string" tunnel="yes" />
        </xsl:apply-templates>
      </fo:flow>
    </fo:page-sequence>
  </fo:root>
</xsl:template>

デフォルトの処理を書き換えるのに、テンプレートに唯一必要なことは、fo:basic-linkを生成する参考文献の相互参照や、付属資料への参照をなくすことである。これにより、XSL組版ソフトからの相互参照に関する警告メッセージがなくなる。

<xsl:template match="xref[@ref-type = ('bibr', 'supplementary-material')]">
  <xsl:apply-templates />
</xsl:template>

メインのスタイルシートは、ページ幅、マージンなど用の変数を宣言する。従って、同じ値が、画像がページ幅かカラム幅かを決める最終出力を行うメインのスタイルシートで使われ、またページ寸法を指定するサイズ調整のスタイルシートで使われる。

前にも述べたように、サイズ調節文書用のエリアツリーはXMLとして保存され、エリアツリーXMLのファイル名はメインのスタイルシートに渡され、単独で動かすときは、パラメタの値となる。スタイルシートがtable-wrap処理を行う時、サイズ調節のエリアツリーにある表の変形寸法を調べ、その寸法に従って、どの表の形式を使うかを決定する。図 10は最終組版でのサイズ調整の文書のうち2つの表を示す。

図 10

組版したページ

pages.png

現在の機能では 表のサイズを自動的にカラム幅、ページ幅 あるいはページの高さの(カラム幅あるいはページ幅のいずれか)に調整することができ、また手動による上書きで、表をページ幅あるいはページの高さにすることもでき、また、ページの高さの表が長すぎたり、幅広すぎた場合、適切なスペースを取って、自動で表分割をすることもできる。表を複数の部分表に分割するとき、分割された表は、サイズ調節用の表から、自身のカラム幅を得て、同じ幅を使うようにし、表の自動アルゴリズが表の部分を最適化したり、ページの下部に空きを残すのを防ぐ。

最終的に、分割スタイルシート(‘splitter’ stylesheets)で前回のパスからのエリアツリーをチェックし、すべてのフロートさせた図表や表が、付属資料や、謝辞、参考文献の前に出現しているか確認する。もしフロートが後付けと重なったら、重なりを避けるため、スタイルシートで後付けを別のfo:page-sequenceに分割する。

表内のTIFF画像を作成する必要はなかったが、もし必要なら、メインのスタイルシートで、それぞれの表用に個々のページ寸法を指定した別のFO文書を出力する。その後、そのFO文書はPDFまたはPostScriptにフォーマットされ、次に、ImageMagickで、TIFFに変換される。

インポートの構造

図 11が示すようにすべてのトップレベルのスタイルシートは基本plos-xslfo.xsl(JATSプレビュー用スタイルシートにあるjats-xslfo.xslを改定したもの)を使う。

splitter.xslsize-chooser.xslがすることすべてと、それ以上のことを行う。従って、plos-xslfo.xslを直接インポートするよりは、そのファイルをインポートする。

図 11

XSLT 2.0 カスタマイズ インポート

imports-xslt20.png

スタイルシートのカスタマイズ

XSL-FO出力用のオリジナルのJATSプレビュー用スタイルシートは約5,500行で、PONE記事を処理するためのメインのスタイルシートは約5,300行だった。plos-xslfo.xslと比較して、2つのスタイルシートで、ファイルが異なるところが358箇所あり、変わらない個所は100行ほどだった。

画像の扱い、表および画像のサイズ調整、大きい表を分割するかどうかを判断するための追加のスタイルシートは、中核のスタイルシートの50%にあたる。

ベンダー拡張機能

XSLTの処理にはベンダーの拡張機能は使われていない。

MathMLは数式の描画に使用された。また、以前に述べたように、カラム幅のフロートはXSL 1.1で定義されていないので、ベンダー拡張が必要であった。カラム幅のフロートを正しく安定して実現させるには、その前に何回ものXSL Formatterの改訂版でのバグ修正があったが、現在私の知る限り、この原稿を書いている時点では、フロートに関しての問題は何もない。

XSLT 3.0

https://github.com/MenteaXML/xslt3testbed は公開されている中型サイズのXSLT 3.0プロジェクトで、我々がもっともよく行っている(X)HTML(5)やXSL-FOへの変換におけるXSLT 3.0新機能を試したり、その途中で、高次元の機能や、部分関数アプリケーションを使って、あるいは他のXSLT 3.0の優れた機能を使って変換を行うための新しいデサインパターンに出くわしたりするのかもしれない。

間違いなく、試みるものはたくさんあるが、手始めとして以下をリストアップした。

  • XSLT3.0で次をどうやって簡単に実現するか?

    • 出力をカスタマイズする。

    • スタイルシートをモジュール化する。

    • HTML、XSL-FOでモジュールを再利用する。

  • 高階関数、無名関数、部分関数適用および動的なXPath評価は、xsl:attribute-setを改善するだろうか?

プロジェクトは進行中である。よってこの論文は今のところの状況を報告している。

時期

プロジェクトは2013年10月にスタートした。XSLT3.0は勧告前に大幅な言語の変更なしで使える程度に熟したが、それほどしっかり熟していないので仕様の変更をしなければ使えないことは出てくるだろう。

W3C仕様書に関するコメントの総括として、仕様がラストコールか勧告候補の段階になるまで、人々はドラフトに関心を示さず、その時点までは、ワーキングクループ(WG)が本質的な変更を加えるのは難しい。

XSLT 3.0 [1] は2013年12月に最終草案(Last Call Working Draft)になった。タイミングは、ちょうど今なのである

JATS

JATSプレビュー用スタイルシートは始めるには良いところである。その理由は:

  • JATSは出版された学術情報の論文(あるいは他分野の)の情報交換、情報保管の媒体として広く使われている。

  • 大きすぎず(DocBookやTEIほど大きくない)小さすぎず(おもちゃレベルでもない)ちょうど良い要素を持つ。

  • サンプルデータが豊富である。

  • XSLT 1.0スタイルシートを使っている。

  • スタイルシートは公開されている。

  • XSLT 1.0スタイルシートにXSLT 2.0の機能を加えて、手っ取り早い解決を手に入れることもできる。

目標

これから行っていくこと:

  • 先行技術を作る。XSLT 3.0を使って様々な技術を試みる。

  • これから何年も使うであろうXSLT 3.0を使ってのパターンやイディオムの開発を早くスタートさせる。

  • XHTMLの表をXSL-FO、HTMLに変換する独立型のXSLT 3.0 xsl:packageを作る。

    xsl:packageはXSLT 3.0では新しい。加えて(X)HTML表はいろいろなドキュメントタイプで広く使われている。従って、XSLT 3.0、XPath 3.0で利用可能な、新しい構文や機能を駆使して、安定した再利用可能な表組版のモジュールを作ればきっと役立つ良いものになる。

目標外

活動の目標にしないこと:

  • 何をするにも一つだけの方法を最高のものと定義すること。

    これはたたき台なので、同じ結果を出すのに違う方法をいろいろ試す。

  • XSLT 3.0の完全なたたき台になること

    Gitプロジェクトをコピーして(folk)、自分自身で好みに開発することが簡単にできるので、このプロジェクトはGitHubで公開している。修正や機能追加のリクエストを提出する(pull requests)のも奨励されるが、自分自身のバージョンを作成するのはもっと素晴らしい。

  • JATSすべてのための完全なスタイルシートとすること

    JATSは汎用サンプルなので、作業に焦点を与え迷うことなく専念させてくれる。がその作業はJATSの焦点とするところではない。また、オリジナルのXSLT 1.0スタイルシートは、始めからJATSのすべてをカバーするとは限らない。したがって、このプロジェクトはJATSをすべてカバーする義務はない。

現時点での成果

2014年3月時点での進捗:

  • W3C Bugzilla システムにXSLT 3.0 や XPath 3.0に関する7件のチケットが投稿される。

    投稿された課題はマイナーでそれは XSLT 3.0への良い兆候である。しかし、今その課題に対処することは、XSLT 3.0が勧告候補かすでに勧告になった時に同じ課題に取り組むより負担が少ない。

  • ネストしたxsl:iterateを使って、属性セットと関数のマップの比較を分析した。

  • オリジナルのJATSプレビュー用スタイルシート[5]に4項目の変更をマージ、さらにpull requestsで提出された修正など加わった。

  • JATS用のWendell PiezによるOxygen framework [4]に1項目の変更をマージ、さらにディスカッションによる修正など加わった。

  • Oxygen add-ons[8]がGitHubのプロジェクトとして公開された。

以後の進捗はGitHub projectのwiki[2]あるいは私のブログ[3]で報告されることになっている。

結論

特に拡張用に設計されているわけでもなく、おそらく明示的に新しい拡張に対応していないとしているが、この論文はJATSプレビュー用スタイルシートがXSLT 1.0あるいはXSLT 2.0のいずれかを使用して、カスタマイズ出力を行うための、良い出発点であること示した。中核スタイルシートの機能の上に、カスタマイズを(ほとんど)重ねることができる人にとっては、XSLT 1.0を使用してカスタマイズすることは有益である。ところが、大規模な修正や拡張機能を追加する人にとっては、スタイルシートを直接修正し、同時に、XSLT 2.0の機能を使うように変更して、その表現力、簡潔性、強力なチェック機能を利用する方が有意義であろう。

この時点でJATSを処理するためにXSLT 3.0を使用することは、JATSを運用で使うための実行可能な戦略というよりも、XSLT 3.0を使用する実験といえる。しかし、XSLT 3.0の叩き台のプロジェクトに参加することは、中核のJATSプレビュー用スタイルシートのために、また、XSLT関連標準が勧告に到達するために、そしてXSLT 3.0の新しい機能を理解するために有益である。

注意

[1]XSL-FOのベンダーのAntenna HouseはこのたびV6.2の新機能として、新しく書き換えたMathMLモジュールをリリースしたので、私がテストした時点での問題は何も起こらなかった。

参考文献

1 

XSL Transformations (XSLT) Version 3.0. http://www.w3.org/TR/xslt-30/

19 

TEI: Text Encoding Initiative http://www.tei-c.org/index.xml

20 

Parameters and customizable templates http://www.tei-c.org/release/doc/tei-xsl/#parameters

22 

NCBI article-fo.xsl v1.0

25 

PLOS ONE Manuscript Guidelines, http://www.plosone.org/static/guidelines

26 

table-wrap, Journal Archiving and Interchange Tag Library NISO JATS version 1.0, http://jats.nlm.nih.gov/archiving/tag-library/1.0/index.html?elem=table-wrap