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の重複エラーを一定程度防ぐことができます.