私は(自分としては)開発者のつもりでいて、実際に日本ではサポート業務はやらないんですが、USのサポートにDITA関連の質問が来てしまった場合、「オマエがやれ!」とお鉢がまわってくることがあります.
今回はそんな感じで常連になってしまったインドの会社の方から次のような質問が来ました.
conref(conkeyref)で参照しているブロックの中にxrefがあって、その宛先をhref=".#/[要素の@id]で参照していると、PDFに変換した場合、xrefがハイパーリンクになってくれない.
というものでした.実際に受け取ったデータからサンプルを作り直してみると次のような具合です.
[conref元: cConrefSourceConcept.dita]
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd"> <concept id="cConrefSourceConcept"> <title>Conref Source Concept</title> <shortdesc></shortdesc> <conbody> <div conref="cConrefTargetConcept.dita#cConrefTargetConcept/div-001"/> </conbody> </concept>
[conref先: cConrefTargetConcept.dita]
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd"> <concept id="cConrefTargetConcept"> <title>Conref Target Concept</title> <shortdesc> Contains conref target elements </shortdesc> <conbody> <div id="div-001"> <p>This paragraph is contained in <xmlelement>div</xmlelement> element and contains xref element that refers paragraph in parent div. <xref href="#./p-999" format="dita">The reference to paragraph authored using <xmlatt>href=#./element-id</xmlatt> notation.</xref></p> <p>Dummy paragraph</p> <p>Dummy paragraph</p> ... <p id="p-999">The referenced paragraph.</p> </div> </conbody> </concept>
DITA-OTの初期処理(preprocess)を通した結果は次のように、xrefで参照している先の@id="p-999"がconrefの処理で@id="d7e148"書き換わってしまっています.
[conrefが展開された結果: cConrefSourceConcept.ditaの中間ファイル(見やすいように修正済み)]
<concept id="cConrefSourceConcept"> <title>Conref Source Concept</title> <conbody> <div> <p>This paragraph is contained in <xmlelement>div</xmlelement> element and contains xref element that refers paragraph in parent div. <xref href="#cConrefSourceConcept/p-999" format="dita" ><?ditaot usertext?>The reference to paragraph authored using <xmlatt>href=#./element-id</xmlatt> notation.</xref> </p> <p>Dummy paragraph</p> ... <p id="d7e148">The referenced paragraph.</p> </div> </conbody> </concept>
この"#./"という記法はDITTA 1.3から取り入れられたもので、いちいちトピックの@idを書かなくとも良いのでお客さんは採用したようです.でも何故かconrefで参照した先にあると動いてくれません.
実はこの"#./"は、conrefされる先にあった場合は期待したようには動きません.上記の例は
conref先が次のようになっていると何の問題もなく動いてくれます.
[conref先: cConrefTargetConcept.dita]
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd"> <concept id="cConrefTargetConcept"> <title>Conref Target Concept</title> <shortdesc> Contains conref target elements </shortdesc> <conbody> <div id="div-001"> <p>This paragraph is contained in <xmlelement>div</xmlelement> element and contains xref element that refers paragraph in parent div. <xref href="#cConrefTargetConcept/p-999" format="dita">The reference to paragraph authored using <xmlatt>href=#topic-id/element-id</xmlatt> notation.</xref></p> <p>Dummy paragraph</p> <p>Dummy paragraph</p> ... <p id="p-999">The referenced paragraph.</p> </div> </conbody> </concept>
実際のcConrefTargetConcept.ditaの中間ファイルを見ると次のように展開されています.
<concept id="cConrefSourceConcept"> <title>Conref Source Concept</title> <conbody> <div> <p>This paragraph is contained in <xmlelement>div</xmlelement> element and contains xref element that refers paragraph in parent div. <xref href="#cConrefSourceConcept/d7e148" format="dita"><?ditaot usertext?>The reference to paragraph authored using <xmlatt>href=#topic-id/element-id</xmlatt> notation.</xref></p> <p>Dummy paragraph</p> ... <p id="d7e148">The referenced paragraph.</p> </div> </conbody> </concept>
DITA 1.3の仕様を見ると、次のように解説されています.
2.4.2.4 Processing xrefs and conrefs within a conref
http://docs.oasis-open.org/dita/dita/v1.3/errata02/os/complete/part3-all-inclusive/archSpec/base/handling-xref-and-conref-within-topics.html#handling-xref-and-conref-within-topics
つまるところ、"#./"と書けば、参照元トピックの中で参照が解決されます.逆を言えば、DITA-OTは参照先トピックの中での@idの変化に合わせてくれる処理をしてくれないのです.
"#./"はconrefされる側で書くのと、conrefされることはない側で書くのでは違うという事を意識しなければならないようです.
しかしこれはちょっと不便にも思えます.再利用を考えると、自分が書いているトピックはいつ何時他のtopicからconrefされるか、オーサリングする人はわからないのですから.