idの重複(2)

DITA-OTでマージされた中間ファイルを作ると、bookmapにつながっていたtopicがすべて結合された状態になります.階層的には

<dita-merge>
  <bookmap>
    <topicref href="#unique1"/>
    <topicref href="#unique2"/>
    <topicref href="#unique3"/>
    <topicref href="#unique4"/>
  </bookmap>
  <topic id="unique1">~</topic>
  <topic id="unique2">~</topic>
  <topic id="unique3">~</topic>
  <topic id="unique4">~</topic>
</dita-merge>

となります.PDFの場合これからXSL-FOを作ります.

今まではすべての要素でid属性があったら、それをXSL-FOに反映させていました.でも良く考えると中間ファイル上でのidはすでにconrefやconkeyrefが完了したあとの状態となります.ですので、idを参照するというのは上記のtopicref/@hreからtopicを参照する場合と、xrefでtopic(concept,reference,task含む),ol/li,fn,table,figを参照する場合に使用されるだけになります.

ですからtopic,ol/li,fn,table,figにidが付いていればXSL-FOに反映させてやらないとxrefで参照先なしになる可能性があります.といいうことは逆にphなんかにidが付いていても、それは見る人は誰も居ないということになります.これからXSL-FOにidを反映させてやる必要はまったくありません.

私が作ったidを生成するテンプレートは

<xsl:template name="getIdAtts" as="attribute()*">
  <xsl:param name="prmElement as="element()" required="yes"/>
  <xsl:param name="prmTopicRef as="element()?" tunnel="yes" required="yes"/>
  ~
</xsl:template>

のようなものでした.($prmTopicRefはtopicの二重参照を検出するためにあります.)

ここで従来は

<xsl:if test="exists($prmElement/@id)">
  <!-- @id属性を生成する-->
</xsl:if>

とやっていたのですが、

<xsl:if test="exists($prmElement/@id) and ($prmElement/@class が ' topic/topic 'または' topic/li 'または' topic/fn 'または ' topic/table 'または' topic/fig 'を含んでいる)">
  <!-- @id属性を生成する-->
</xsl:if>

と変更しようと思います.

CMSによっては、phなんかに大量に同じidがついてチェックアウトされる場合があります.このようにすれば、XSL-FOをFormatterにかけたときに出るidの重複エラーを一定程度防ぐことができます.