DITA-OTのカスタマイズ

DITA-OTには前処理の工程(preprocessと呼ばれる)があって、入力となるmapやtopicをパースし、conrefやフィルタリングなど様々な処理をやってくれます.ここでのDITA-OTの処理をカスタマイズできるのが「拡張ポイント」(Extension point)と呼ばれるものです.例えばDITA-OT 1.8.xの場合、つぎのような拡張ポイントが定義されています.

Override styles with XSLT

今まで拡張ポイントなんて使ったことがなかったのですが、前のポストで書いたようにどうしても修正が必要になってしまいました.なんとか自力でできたので、仕組みもそれなりにわかりました.すこしそれについて紹介します.

まず、topicrefからmapを参照するときに使用するXSLTスタイルシートは次の箇所で定義されています.

[DITA-OT1.8.5]/xsl/preprocess/mapref_template.xsl

これは実際に動くmapref.xslの雛型になるものです.次のような構造になっています.簡単ですので載せます.

<?xml version="1.0" encoding="UTF-8"?>
<!-- This file is part of the DITA Open Toolkit project hosted on 
    Sourceforge.net. See the accompanying license.txt file for 
    applicable licenses.-->
<!-- (c) Copyright IBM Corp. 2006 All Rights Reserved. -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:import href="maprefImpl.xsl"/>
    <dita:extension id="dita.xsl.mapref" behavior="org.dita.dost.platform.ImportXSLAction" xmlns:dita="http://dita-ot.sourceforge.net"/>
    <xsl:output method="xml" encoding="utf-8" indent="no" />
</xsl:stylesheet>

中ほどにある、dita:extensionというのがオマジナイです.DITA-OT 1.8.5をインストールした状態ではこれはmapref.xslで次のように変わっています.

<?xml version="1.0" encoding="utf-8"?><!-- This file is part of the DITA Open Toolkit project hosted on 
    Sourceforge.net. See the accompanying license.txt file for 
    applicable licenses.--><!-- (c) Copyright IBM Corp. 2006 All Rights Reserved. -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:import href="maprefImpl.xsl"></xsl:import>
   <xsl:import href="../../plugins/org.dita.specialization.eclipsemap/xsl/mapref-plugin.xsl"/>
   <xsl:output method="xml" encoding="utf-8" indent="no"></xsl:output>
</xsl:stylesheet>

このようにdita:extensionはxsl:importに変わっています.これはEclipse Helpのプラグイン(DITA-OT1.8.5/plugins/org.dita.specialization.eclipsemap)で、plugin.xmlが次のようになっているからです.

<feature extension="dita.xsl.mapref" file="xsl/mapref-plugin.xsl"/>

例えば私のプラグイン(com.myCompany.pdf)で同じように拡張ポイントを定義し、startcmd.batを実行して、ant -f integrator.xmlと叩いてプラグインを組み込めばmapref.xmlは次のように変わります.

<?xml version="1.0" encoding="utf-8"?>
<!-- This file is part of the DITA Open Toolkit project hosted on 
    Sourceforge.net. See the accompanying license.txt file for 
    applicable licenses.-->
<!-- (c) Copyright IBM Corp. 2006 All Rights Reserved. -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:import href="maprefImpl.xsl"/>

    <xsl:import href="../../plugins/com.myCompany.pdf/xsl/dita2fo_mapref_customize.xsl"/>
    <xsl:import href="../../plugins/org.dita.specialization.eclipsemap/xsl/mapref-plugin.xsl"/>
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
</xsl:stylesheet>

きわめてよくできているように見えるかもしれません.しかしこのDITA-OTの拡張ポイントの定義には大きな問題があります.次にその問題について気が付いた点を書きたいと思います.