xrefの落とし穴

会社のGitHubリポジトリオープンソースでDITA-OTのプラグインを公開しています.


製品ではなく、サポートや保証は基本的にないんですが、それでもUSのサポートに質問が来てしまうことがあります.(本当はGitHubのissueに登録してくれればよいのですが)そのなかにtopicを参照するxrefの出力を変えたいというものがありました.

<xref href="cSampleConcept.dita#cSampleConcept" format="dita">"How to repair"</xref>

とあると大抵は参照先のconcept/titleの内容を参照先のラベルとして出します.でもこの質問をしてきたお客さんはxrefのコンテンツの"How to repair"を出したいというのです.これはちょっとコードを変えればできるはずです.いきなりコードを出してすみませんが

<xsl:apply-templates select="$prmXref" mode="GET_CONTENTS"/>

というコードに変えるだけです.ところが変えるとこの場合"How to repair"だけでなく、cSampleConcept.ditaのshortdescの内容も出てしまうのでプラグインのバグではないか?との質問です.雑な例ですみませんが、cSampleConcept.ditaが以下の様になっているとすると、

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
<concept id="cSampleConcept">
    <title>Reparing your car</title>
    <shortdesc>You can repair your car by yourdelf</shortdesc>
    <conbody>
        <p>Body paragraph</p>
    </conbody>
</concept>

"How to repairYou can repair your car by yourdelf"と出てしまうとのことです.そんな訳はないと実際にやってみるとその通りでした.ガーン!調べてみると、DITA-OTの処理をさせると中間ファイルではxrefは次のようになっていました.(一部属性省略)

<xref href="#unique_1" format="dita" class="- topic/xref "><?ditaot usertext?>How to repair<?ditaot genshortdesc?><desc
      class="- topic/desc ">You can repair your car by yourdelf</desc></xref>

なんとDITA-OTが参照先のconcept/shortdescをxref/descとして自動的に展開してくれてしまっていました.これではそのままテキストを拾えば"How to repairYou can repair your car by yourdelf"となるだけです.

とりあえずの解決策は先のコードを次のように変えることです.

<xsl:apply-templates select="$prmXref/node() except *[contains(@class,' topic/desc ')]" mode="GET_CONTENTS"/>


これでお客さんも"Ok Toshihiko ....Thanks a lot !!"とわかってくれてなんとか話は収まりました.

お客さんといっても知っているのはメールアドレスだけで、かつメールを送ってくる時刻を見るとどうもヨーロッパのようです.このようなお客さんと私の書いたたった一行のコードでやりとりしています.オープンソースと言えど使ってもらうとなるとやはり責任は大きいものです.