DocBookの分散オーサリング

DITAのお話ではないのですが、このまえ「DocBookの場合なんかはトピック志向ではないので~」などと書いてしまいました.確かにDocBookが作られた時代にはトピック志向という考え方はなかったと思います.ただしトピック志向はなくとも「分散オーサリング」という点でみれば先輩のDocBookでもちゃんとした仕組みがありました.ここは私の理解がxref一辺倒でいまいちだったのでちょっと書いておきたいと思います.
 
まず分散オーサリングを前提としての参照です.xrefはその文書内を参照するため、最上位のset以下のすべてが揃っていないと使えないのに比べ、別々の単位でオーサリングして互いを間接的に参照することができる仕組みとしてolinkがあります.またXIncludeを使って分散してオーサリングした結果を結合します.
 
Chapter 23. Modular DocBook files
http://www.sagehill.net/docbookxsl/ModularDoc.html
 
The best tools for modular documentation are XIncludes and olinks.
 
このサイトのDocBook XSLはBob Staytonさんが作者でメンテナンスしておられます.本も出ています.(昔DocBookの仕事で買ってよく見たのですが、その後は例のごとく積読状態でした.)
 
 
さて最初のolinkですが、つぎのような形で記述します.
 
<olink targetdoc="[bookのid]" targetptr="[bookの下位の参照先のid]">[仮の表題]</olink>
 
DocBookは最上位がsetで次がbookです、targetdocである分冊からの参照先の分冊を決めます.そしてtargetptrでその下の参照先を確定させます."[仮の表題]"は、分冊が結合されたらちゃんと参照先のタイトルが入るようにスタイルシートが処理しなければなりません.
たとえば「Mail User's Guide」から「Mail Admin Guide」の「User Accounts」の章を参照するには次のように書くでしょう.
 
You may need to update your
<olink targetdoc="MailAdminGuide" targetptr="user_accounts">user accounts
</olink>
when you get a new machine.
 
これは
 
Chapter 24. Olinking between documents
http://www.sagehill.net/docbookxsl/Olinking.html
 
に載っているサンプルです.
 
さて次のポイントは、DocBook自体はDITAのようにmapという構造を持っていうわけではないので最終的にそれは1つのXMLファイルにバインドされなければなりません.これを実現するのがXIncludeです.
たとえば次のサンプルはoXygenについてきたものをbookベースに書き直したものです.
 
<set xmlns="http://docbook.org/ns/docbook"
    version="5.0"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Welcome to Docbook</title>
    <xi:include href="book1.xml"/>
    <xi:include href="book2.xml"/>
    <xi:include href="book3.xml"/>
</set>
 
oXygenでこのXMLを開くとちゃんとXIncludeが機能して参照先XMLファイルが表示されます.個々の参照先もちゃんと検証されます.しかし編集するにはコンテキストメニューから「Edit Reference」を選んでそのファイル自体を開かねばなりません.
 
またoXygenのようなXMLエディタからolinkを作るのに、targetdocやtargetptrをいちいち手書きしていたのでは業務になりません.やはり自動的にリンク先候補を表示してくれる仕組みがほしいものです.このような用途にDocBookではsitemapというXMLファイルを作ります.たとえば先ほどのsetに対応するsitemapのサンプルは以下のようなものです.やはりこのようなファイルが必要なのですね.
 
<targetset>
    <targetsetinfo> Description of this target database document. </targetsetinfo>
    <!-- Site map for generating relative paths between documents -->
    <sitemap>
        <dir name="documentation">
            <document targetdoc="book1" href="book1.xml">
                <div targetptr="chapter1"><xreftext>Chapter 1</xreftext></div>
            </document>
            <document targetdoc="book2" href="book2.xml">
                <div targetptr="chapter2"><xreftext>Chapter 2</xreftext></div>
            </document>
            <document targetdoc="book3" href="book3.xml">
                <div targetptr="chapter3"><xreftext>Chapter 3</xreftext></div>
            </document>
        </dir>
    </sitemap>
</targetset>
 
これでoXygenからはメニューでDocBook5→Link→Insert Olinkと選んで更にこのsitemapのファイルを選択すると次のように候補が表示されます.
 
イメージ 1
 
OKを押して挿入するとちゃんとolinkが生成されます.
 
イメージ 2
 
DocBookは広く使われています.さきほどのDocBook XSLの本が出たのは2003年でした.しかしやはり今の時点に立つとDITAの方が新しい分、仕様やとりまく環境の進歩も早いように感じられます.