スタイルシート(xsl)のオーバーライド

DITA-OTで出力されるHTMLの<dl>の<dt><dd>を<table>の<td>に置き換えたいとか、既存のCSSに合わせて<div>でくくりたいとか、CSSで対応できないレベルでHTML出力を変更したかったりCSSが変えられない場合には、xsl側を変更する必要に迫られます。また、特殊化したDTDで書いたxmlソースを独自レイアウトで出力するには、xslを書き起こす必要があります。

DITA-OTのxslファイルはそのままxslディレクトリに格納されているのでこれを書き換えてしまえば簡単なのですが、それはあまりスマートなやり方とは思えませんので、DITA-OTでの変換時に必要部分だけ書いた自前のxslファイルを読み込ませる方法を調べました。


これはどうも、ちゃんとやろうとするとプラグインとして整備するのがよさそうな感じなのですが、とりあえずは簡単そうな方法で。

ビルドファイルは、テンプレートからコピーして次の様な内容になります。

<?xml version="1.0" encoding="UTF-8" ?>
<project name="document_xhtml" default="document2xhtml" basedir=".">
  <property environment="env" />
  <property name="dita.dir" value="${env.DITA_DIR}"/>
  <import file="${dita.dir}${file.separator}integrator.xml"/>
  <target name="document2xhtml" depends="integrate">
    <ant antfile="${dita.dir}${file.separator}build.xml" target="init">
      <property name="args.input" value="document.xml"/>
      <property name="output.dir" value="out"/>
      <property name="transtype" value="xhtml"/>

      <property name="args.xsl" value="custom.xsl"/> << 足す

    </ant>
  </target>
</project>

上記のように、"args.xsl" に自前のxslを指定します。custom.xslの内容は次の様な感じに。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet
	version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- 標準のxslをインポートする -->
<xsl:import href="../../../DITA-OT/xsl/dita2html.xsl"/>

<!-- 変更箇所のtemplateを書く -->
<xsl:template match="*[contains(@class,' hi-d/b ')]" name="topic.hi-d.b">
  <xsl:variable name="flagrules">
    <xsl:call-template name="getrules"/>
  </xsl:variable>
 <strong>
  <xsl:call-template name="commonattributes"/>
  <xsl:call-template name="setidaname"/>
  <xsl:call-template name="flagcheck"/>
  <xsl:call-template name="revtext">
   <xsl:with-param name="flagrules" select="$flagrules"/>
  </xsl:call-template>
  </strong>
</xsl:template>

</xsl:stylesheet>

ポイントはコメントの2箇所。

HTMLとして出力される特定のタグの構造に手を入れたい時は、DITA-OT標準のxslから自前のxslにコピペして書き換えます。
上記はui-d.xslから "b"要素(hi-d/b) の箇所をコピーしたそのままです。"strong" を "i" に書き換えれば、「強調」で出力されていた箇所が「斜体」に置き換わります。

後記:どうもdita2xhtml_template.xslが流用できそうな気がするので後で調べてみよう。

ちなみにDITA-OTユーザーズガイド(英語)では下記に書かれている様子。

ユーザーズガイド
http://dita-ot.sourceforge.net/doc/ot-userguide/xhtml/index.html
該当箇所
http://dita-ot.sourceforge.net/doc/ot-userguide/xhtml/customizing/xslt_processing.html