DITAの変更履歴(2)

oXygenのchange tracking機能は削除の結果を処理命令の中に保存して、PDFに出してもXMLインスタンスとしては最新の状態で見られるようになっています。処理命令は通常はコンテンツとしては無視されるからです。これは優れていると同時に逆に処理命令を解釈しようとすると難しさも伴います。

例えば、次のように挿入削除するのがテキストでなく要素である場合、削除された要素が処理命令の中にタグの"<"や">"をエスケープして保存されます。この例では削除された「開国」、挿入された「壊国」はiタグで囲まれています。

イメージ 1


<p>安倍さんのTPP<?oxy_delete author="toshi" timestamp="20140321T230056+0900" content="&lt;i&gt;開国&lt;/i&gt;"?><i><?oxy_insert_start author="toshi" timestamp="20140321T230041+0900"?>壊国<?oxy_insert_end?></i></p>

このようなXMLの表現形式は外に出したときは処理命令になっていますが、XMLエディタの中ではもっと違った構造で記録されているのでしょう。

処理するのに難しいと言うのは、単にエディタで見ているだけならこれで問題ないのですが、やはりPDFやHTMLにこの新旧の表示を出してレビューしたいと思うのが人情で、そうするためには処理命令の中のエスケープされたタグを元に復元する必要があるからです。

世の中にはやはり同じようなことを考える人がいるもので、DITA Usersには、このようなoXygenの修正履歴の出力をなんとかXMLとして解釈したいという投稿がありました。

Rendering oxy_delete Processing Instructions

この質問に対して、oXygenのGeorgeさんがサンプルコードを示してやり方を説明しています。さっとコードを見た感じですが、確かに単純な要素が処理命令の中に保存されているならこれでいけるのかもしれません。うまくすれば

<p>安倍さんのTPP<?oxy_delete author="toshi" timestamp="20140321T230056+0900"?><i>開国</i><?oxy_delete_end?><i><?oxy_insert_start author="toshi" timestamp="20140321T230041+0900"?>壊国<?oxy_insert_end?></i></p>

というような解釈をすることも可能でしょう。

でももしkeyrefやconref、conkeyrefを属性に含んだ要素が削除されていたとすると事態はそう簡単にはゆかないです。例えば次の例は、mapに

 <keydef keys="KAIKOKU_OPEN" navtitle="開国">
  <topicmeta>
   <keywords><keyword>開国</keyword></keywords>
  </topicmeta>
 </keydef>

 <keydef keys="KAIKOKU_BREAK" navtitle="壊国">
  <topicmeta>
   <keywords><keyword>壊国</keyword></keywords>
  </topicmeta>
 </keydef>

と定義してkeyrefでこれを参照している場合です。これだと当たり前ですがkeyrefを含んだterm要素が処理命令の中にエスケープされて保存されます。

イメージ 2

<p>安倍さんのTPP<?oxy_delete author="toshi" timestamp="20140321T225157+0900" content="&lt;term keyref=&quot;KAIKOKU_OPEN&quot;/&gt;"?><?oxy_insert_start author="toshi" timestamp="20140321T225137+0900"?><term  keyref="KAIKOKU_BREAK"/><?oxy_insert_end?></p>

つまりこのXMLから削除部分を要素に復元して取り出したかったら

1.いったんパーサーで読み込んで、処理命令の中のエスケープされた要素を復元する。結果をXMLファイルとして書き出す。
2.もう一度そのファイルをパーサーで読み込んでkeyrefをDITA-OTに処理させる。

という手順を踏まねばなりません。もちろん最終的に挿入/削除の情報を保持しなければなりませんから、処理命令も工夫しなければなりません。上記の例でしたら1の結果として

<p>安倍さんのTPP<?oxy_delete_start author="toshi" timestamp="20140321T225157+0900"?><term keyref="KAIKOKU_OPEN"/><?oxy_delete_end?><?oxy_insert_start author="toshi" timestamp="20140321T225137+0900"?><term  keyref="KAIKOKU_BREAK"/><?oxy_insert_end?></p>

とできれば、PDFやHTML出力でoXygenの表示結果と同じようなものを得ることも可能です。

という訳で、やはりXMLの更新履歴の処理と言うのはそう簡単ではないということが身にしみてよくわかりました。