恐怖のindex-sort-as

お盆前、もう退社時間も間近というときに海外から飛び込んできた障害報告は「索引にページが出ない」というものでした.私は「索引」と聞いただけでゾッとします.自分でスタイルシートを作ってはいるのですが、索引の出力処理はきわめて複雑で、一度入り込んだらなかなか抜け出せない泥沼みたいなものだからです.障害はこのようなものでした.
 
[1] エラーの場合
Fruits
  Apple  ........ 4
  Banana ........ 2
  Orange ........ 3
 
とあるのですが、実はFruitsにも目次が出るはずというものです.つまり本来次のようになるべきということです.
 
[2] 正常な場合
Fruits .......... 1
  Apple  ........ 4
  Banana ........ 2
  Orange ........ 3

正常な場合の例はDITAで言えば次のようなindextermの場合に該当します.
 
<indexterm>Fruits</indexterm>
<indexterm>Fruits
    <indexterm>Apple</indexterm>
</indexterm>
<indexterm>Fruits
    <indexterm>Banana</indexterm>
</indexterm>
<indexterm>Fruits
    <indexterm>Orage</indexterm>
</indexterm>
 
スタイルシートはうま~くソートして、最初の<indexterm>にもページ参照を生成しなければなりません.Fruitsにページ参照が出ない場合は、
 
<indexterm>Fruits
    <indexterm>Apple</indexterm>
</indexterm>
<indexterm>Fruits
    <indexterm>Banana</indexterm>
</indexterm>
<indexterm>Fruits
    <indexterm>Orage</indexterm>
</indexterm>
 
のようなindextermの構成のときです.この場合はFruitsは単なるラベルになります.
 
スタイルシートはもうお客様のところで稼動して3年になるのですが、もしかしたらまだスタイルシートにバグがあったかな?あったら直すの大変だろうなという思いが頭をよぎりました.いただいたデータをDITA-OTのsampleフォルダに入れて動かしてみました.すると結果はやはりお客様の指摘どおりです.ページ参照が現れるべきFruitsのところには何もなく[1]エラーの場合で示したようになっています.
 
データの規模が大きいのでなかなかgrepだけでデータを検索しても原因がわかりません.最後は<indexterm>をテンポラリーツリーに入れてソートした結果のダンプを見ることにしました.すると別にデータが消失している訳ではなく
 
<indexterm>Fruits</indexterm>
 
のデータはちゃんとありました.でもソート順が狂っています.言ってみれば
 
<indexterm>Fruits
    <indexterm>Apple</indexterm>
</indexterm>
<indexterm>Fruits</indexterm>
<indexterm>Fruits
    <indexterm>Banana</indexterm>
</indexterm>
<indexterm>Fruits
    <indexterm>Orage</indexterm>
</indexterm>
 
の順にソートされてしまっています.これでは、Fruitsにページ参照が出なくて当然です.さすがにそこまで対応できるようにはスタイルシートは作っていないのですから.それにしてもなぜこんな風にソートされてしまったのでしょう.データをよく見ると犯人はなんと<index-sort-as>でした.ちょうど以下のように<index-sort-as>が指定してあるのでソート順が狂ってしまったのです.
 
<indexterm>Fruits<index-sort-as>fruit</index-sort-as>
    <indexterm>Apple</indexterm>
</indexterm>
<indexterm>Fruits<index-sort-as>fruits</index-sort-as></indexterm>
<indexterm>Fruits<index-sort-as>fruits</index-sort-as>
    <indexterm>Banana</indexterm>
</indexterm>
<indexterm>Fruits<index-sort-as>fruits</index-sort-as>
    <indexterm>Orage</indexterm>
</indexterm>
 
なぜ英語なのにindex-sort-asを入れているのかと思われるかもしれませんが、たぶんお客様のところでは最初に英語のマニュアルを作って、そこから日本語のマニュアルを作っています.index-sort-asを日本語のマニュアルを作るときにいちいち入れるのはやっかいなので、英語で最初に作るときから入れているのだと思います.
index-sort-asの内容がindextermと同じならばなんの問題もありませんが、スタイルシートにとってソート順を決めるのにindex-sort-asの内容は「絶対」です.こうソートされてしまっては、Fruitsのページ参照は出すことができません.
 
index-sort-asは本来は日本語専用で使われます.
 
<indexterm>日本国憲法<index-sort-as>にほんこくけんぽう</index-sort-as></indexterm>
 
しかし、まれに英語でも使う場合があります.
 
<indexterm>&amp;amp;<index-sort-as>amp</index-sort-as><
 
ですからたとえ英語であってもindex-sort-asは無視できないのです.今回はオーサリングを以下のように直してもらって目的の結果を得ることができました.
 
<indexterm>Fruits<index-sort-as>fruits</index-sort-as></indexterm>
<indexterm>Fruits<index-sort-as>fruits</index-sort-as>
    <indexterm>Apple</indexterm>
</indexterm>
<indexterm>Fruits<index-sort-as>fruits</index-sort-as>
    <indexterm>Banana</indexterm>
</indexterm>
<indexterm>Fruits<index-sort-as>fruits</index-sort-as>
    <indexterm>Orage</indexterm>
</indexterm>
 
index-sort-asは思わぬところで誤動作を誘発します.一つ利口になれました.