oXygen v17.1のDITA1.3サポート - Key scopes

DITA1.3の規格は、まだ、OASISで承認されていませんが、仕様はほぼ固まっています。oXygen v17.1でDITA1.3(experimental)がサポートされたことを知り、さっそく試してみました。
Syncro SoftのDITA1.3 Support紹介ビデオは こちら です。

今回試したのは、昨年のDITA Festaのときに発表した、「スコープ付きキー」(Key scopes)の機能です。

Key scopesを使うと、1冊のマニュアルの中で、トピックを再利用し、かつ、そのトピックの内容をコンテキストに応じて変えることができます。例えば、下図に示したように、「フィルターの交換手順」というトピックがあったとします。1冊のマニュアルの中に、MN-01, MN-02, MN-03という3つの製品モデルの説明を書きます。トピックの内容は、ほぼ同じなのですが、モデル名やイラストを製品モデルごとに変えなければいけません。サービスマニュアルなどでは、よくあるケースだと思います。

このようなケースでは、可変にするモデル名とイラストをキー参照にして、次のようにトピックを書きます。モデル名はstr_model、イラストはimg_engineというキー名になっています。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE task PUBLIC "-//OASIS//DTD DITA 1.3 General Task//EN" "generalTask.dtd">
<task id="task_rb1_xvk_54" xml:lang="ja-JP">
  <title>オイルフィルタの交換手順(<ph keyref="str_model"/>)</title>
  <prolog>
    <metadata>
      <keywords>
        <indexterm><ph keyref="str_model"/>
          <indexterm>オイルフィルタ</indexterm></indexterm>
      </keywords>
    </metadata>
  </prolog>
  <taskbody>
    <prereq>
      <p><u>用意するもの</u></p>
      <ul>
        <li>オイルフィルタレンチ</li>
        <li>オイルパン</li>
        <li>新しいオイルフィルタ</li>
        <li>新しいエンジンオイル</li>
      </ul>
    </prereq>
    <context>
      <p><u>予備知識</u></p>
      <p>エンジンオイルを交換するとき、2回に1回はエンジンオイルフィルタもいっしょに交換してください。</p>
      <image placement="break" id="image_ybk_3yk_54" keyref="img_engine"/>
    </context>
    <steps>
      <stepsection><u>手順</u></stepsection>
      <step id="step_wwj_bzk_54">
        <cmd>エンジン<ph keyref="str_model"/>の下にオイルパンを置き、エンジンオイルのドレインボルトを取外します。</cmd>
      </step>
      <step id="step_lxj_bzk_54">
        <cmd>エンジンオイルがほとんど落ちなくなるまで待ちます。</cmd>
      </step>
      <step id="step_p2f_tzk_54">
        <cmd>オイルフィルタを取外します。</cmd>
      </step>
      <step id="step_u51_5zk_54">
        <cmd>新しいオイルフィルタのO-リングに少量のエンジンオイルを塗布してから、オイルフィルタを取付けます。</cmd>
      </step>
      <step id="step_vsk_11l_54">
        <cmd>ドレインワッシャを交換し、ドレインボルトを取り付けます。</cmd>
      </step>
      <step id="step_vlc_f1l_54">
        <cmd>新しいエンジンオイルを注入します。</cmd>
      </step>
      <step id="step_kyg_g1l_54">
        <cmd>オイルレベルゲージでエンジンオイル量を確認します。</cmd>
      </step>
      <step id="step_mvz_k1l_54">
        <cmd>オイルフィラキャップを締めます。</cmd>
      </step>
    </steps>
  </taskbody>
</task>

マップからトピックを参照するとき、キー定義の有効範囲をkeyscope属性で指定します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "map.dtd">
<map xml:lang="ja-JP">
 <title>Keyref sample-01</title>
 <topicref href="t_change_filter.dita" copy-to="t_change_filter_MN-01.dita" keyscope="MN-01">
  <keydef keys="str_model">
   <topicmeta>
    <keywords>
     <keyword>MN-01</keyword>
    </keywords>
   </topicmeta>
  </keydef>
  <keydef keys="img_engine" href="img/MN_01.png" format="png"/>
 </topicref>
 <topicref href="t_change_filter.dita" copy-to="t_change_filter_MN-02.dita" keyscope="MN-02">
  <keydef keys="str_model">
   <topicmeta>
    <keywords>
     <keyword>MN-02</keyword>
    </keywords>
   </topicmeta>
  </keydef>
  <keydef keys="img_engine" href="img/MN_02.png" format="png"/>
 </topicref>
 <topicref href="t_change_filter.dita" copy-to="t_change_filter_MN-03.dita" keyscope="MN-03">
  <keydef keys="str_model">
   <topicmeta>
    <keywords>
     <keyword>MN-03</keyword>
    </keywords>
   </topicmeta>
  </keydef>
  <keydef keys="img_engine" href="img/MN_03.png" format="png"/>
 </topicref>
</map>

このマップでは、1つのトピックを3箇所から参照しています。それぞれの箇所で、モデル名とイラストの実態を指定しています。このとき、topicref要素のkeyscope属性を使って、キーの有効範囲を指定するのがポイントです。こうすれば、同じ名前のキーに対して、異なる実態を指定できるようになります。
PDFをパブリッシュしてみると、ちゃんとモデル名とイラストが変わっていることが確認できます。

このKey scopesを使ったトピックをoXygen v17.1で編集すると、コンテキストに応じて、ちゃんとキー参照のプレビューを表示してくれるのです。

素晴らしい!! です。