2014年の11月に行われたDITA Festa 2014で、DITAコンソーシアムジャパンのIA部会のプレゼンがありました.そこでは(その時はまだ来るべき)DITA 1.3の様々な特徴が紹介されました.そのひとつに「分冊間参照(異なる分冊同士のリンク)がDITA 1.3では出来るようになります」という言及がありました.例えばPDFではあるPDFから別のPDFへリンクを張れるという事になります.
私はそれを聞いていて、「PDFにおいて分冊間参照が如何に大変か?」また「実際にDITA-OTでインプリメントできるのか?」という点で疑問の意見を出しました.もうそれから2年が経とうとしています.確かに分冊間参照はDITA 1.3では仕様として記述されています.
2.3.4.5 Cross-deliverable addressing and linking
しかし実際に今のDITA-OTでどのようになっているのでしょうか?やってみるとすぐわかります.
1. mapの準備
DITA-OT 1.8.5までおまけで付いてきたsamplesフォルダのsequence.ditamapに次のような記述を加えます.
<map id="map_2E3A2E4C04634118AD48D94CD092E90A" title="Eclipse content aggregated by a map">
...
<topicref href="concepts/wwfluid.xml" navtitle="Windshield washer fluid" type="concept"/>
<mapref keyscope="other-map" scope="peer" href="taskbook.ditamap"/>
<keydef keys="other-topic-installing" keyref="other-map.installing"/>
</map>
意味としてはmaprefでscope="peer"をつけることにより、taskbook.ditamapがこのmapではない別のpublicationであることを表現します.そしてkeydefでこのtaskbook.ditamapの中のinstallingというkeyが付けられたtopicref(従ってそれが指すtopic)を参照することを定義します.
<bookmap id="taskbook">
<booktitle>
<booklibrary>Retro Tools</booklibrary>
<mainbooktitle>Product tasks</mainbooktitle>
...
<chapter href="taskbook/installing.dita" keys="installing">
...
</bookmap>
2. トピックからの参照
sequence.ditamapの中のトピックからは、@keyrefを使用して、次のようにしてこれを参照します.
<p>Refer to <xref keyref="other-topic-installing" format="dita"/></p>
3. ビルド
これで最新のDITA-OT 2.4でPDFをビルドしてみます.すると結果のxrefの箇所には何も現れません.ログには次のように出ます.
keyref:
[keyref] Reading file:/D:/DITA-OT/DITA-OT1.8.5/samples/temp/pdf/sequence.ditamap
[keyref] Processing file:/D:/DITA-OT/DITA-OT1.8.5/samples/temp/pdf/sequence.ditamap
[keyref] file:/D:/DITA-OT/DITA-OT1.8.5/samples/sequence.dita: [DOTJ047I][INFO] Unable to find key definition for key reference "other-map.installing" in root scope. The href attribute may be used as fallback if it exists
[keyref] Processing file:/D:/DITA-OT/DITA-OT1.8.5/samples/temp/pdf/concepts/wwfluid.xml
[keyref] Processing file:/D:/DITA-OT/DITA-OT1.8.5/samples/temp/pdf/sequence.ditamap
[keyref] file:/D:/DITA-OT/DITA-OT1.8.5/samples/sequence.dita: [DOTJ047I][INFO] Unable to find key definition for key reference "other-map.installing" in root scope. The href attribute may be used as fallback if it exists
[mapref] Transforming into D:\DITA-OT\DITA-OT1.8.5\samples\temp\pdf
[mapref] Loading stylesheet D:\DITA-OT\dita-ot-2.4\xsl\preprocess\mapref.xsl
[mapref] Processing D:\DITA-OT\DITA-OT1.8.5\samples\temp\pdf\sequence.ditamap
[mapref] Recoverable error on line 356 of maprefImpl.xsl:
[mapref] FODC0002: java.io.FileNotFoundException:
[mapref] D:\DITA-OT\DITA-OT1.8.5\samples\temp\pdf\taskbook.ditamap (指定されたファイルが見つかりません。)
つまり、分冊間参照はDITA-OTにはまったく実装されていません.これは無理からぬことです.いくらDITAの仕様の上で分冊間参照が定義されても、DITA-OTは
・ 参照しているtaskbook.ditamapからどういう名称のPDFが生成できるかわからない.
・ 参照している<chapter href="taskbook/installing.dita" keys="installing">のinstalling.ditaが(PDF上で)どのような外部からアクセスできるIDをエキスポートするのかわからない.
からなのです.でも上記の2つがわかれば別にDITA 1.3を採用しなくとも分冊間参照は実現できます.実際DITA 1.2で分冊間参照を実現しているお客様は現に存在します.
分冊間参照はDITA 1.3の仕様の上では「解決」されました、しかし(たぶん)「永久」にDITA-OTでは実装されることはないだろうと思います.上記の2つの情報をDITA-OTに与えることは実は極めて困難であるからです.
まず現実問題で実装できないことを仕様上で解決したとしてもそれは(私にとっては)絵に描いた餅にしか過ぎないように思えます.(言いすぎでしょうか???)