属性の特殊化

属性の特殊化ってやったことはありますでしょうか?既存のDITAの要素に自分の組織にあわせて便利な属性をつけようというものです.よくあるパターンでは次のようなものがあります.

1.xrefでトピックに対する相互参照を行うとき、参照先トピックの表題/参照先トピックの表題+ページ番号/ページ番号のみというのをコントロールしたい.(PDFでだけ有効でHTMLはページなんてないので無効)
2.olの行頭番号やulの行頭文字を自由に指定できるようにしたい、例えばulだったら中黒"・”や、"-"や"*"を自分で制御したい.

などというものです.このような機能はDITAにDocBookなどから移行する組織では当たり前のように使われていて、どうしても欲しいという要望になります.

しかしDITAの特殊化の仕様を読んでもこのような特殊化のやり方は出てきません.例えばDITA 1.2の特殊化の説明では次のように書かれています.

2.1.4.3.8.1.5 Attribute domain module coding requirements

An attribute domain vocabulary module declares a new attribute specialized from either the @props or @base attribute. An attribute domain module defines exactly one new attribute type.

つまり、@propsや@baseを特殊化したものに限定されます.これらはselect-attsに属していて、productやplatformなどと同様に.ditavalファイルによるフィルタリングに用いられます.つまりざっくり言えばDITAの属性の特殊化はフィルタリング属性を増やすことしかできません.

oXygenにも搭載されている有名な、Tony Selfの"DITA Style Guide"でもダメと明確に書かれています.

The DITA Style Guide Best Practices for Authors
Specialisation

Specialisation rules in DITA include the following:

* You cannot make your specialised DITA less restrictive (have looser rules) than the DITA base content model.
  * You cannot make a mandatory ancestor element optional, and you cannot make a mandatory attribute optional.
  * You cannot allow elements in positions that are not allowed by the base content model.
* You cannot add new element-specific attributes. You can only create new global attributes (or attributes of elements in the base content model.

でも実際問題お客様の前で「それはできません」とは言えません.で既存の要素に属性を加えたり、属性値の範囲を広げたりします.こうしなければ現実の要請に答えることはできないからです.

もちろん例のごとく汎用の@outputclassにそのような意味を持たせて逃げることもできるでしょう.例えばxrefの例だったら

<xref outputclass="title"/> <!--タイトルのみ -->
<xref outputclass="title-and-page"/> <!--タイトルとページ -->
<xref outputclass="page"/> <!--ページのみ -->

などと書けます.でも@outputclassなんてなんでもありの属性なのでちょっとスペルミスをしてもそのままエラーなしで最後まで通ってしまうでしょう.
この場合だったらDTDでxref-style="title/title-page/page"とでも追加してあげて入力ミスを減らした方が効果があります.

何故属性の特殊化はダメなのでしょうか?dita-usersのやりとりのなかで、それはDITAの特殊化のメカニズムのなかで@class属性だけでは、ある要素のある属性が加わったというような情報を表現するのがそのそも無理であるからとの指摘を受けました.


の中のEliot Kimberさんのポスト

This limitation is a side effect of the syntax of the @class
attribute--there is just no easy way for a simple single-attribute
mechanism to enable declaration of specializations of individual
attributes on individual elements.

(これはdita-usersで私が恥をかいたスレッドです)

たしかにそうなのかもしれません.このような特殊化をしても、それは@class属性からは識別することはできないからです.でも属性追加ならほとんどの場合それを「知らない」(インプリメントしていない)処理系にまわしても無視されてデフォルトの処理が行われるだけなので害はないのではないか?という気もします.

このあたり世界では実際問題どのようにしているのか??知りたいところなのですがなかなか情報がありません.私にはまじめにDITAの仕様に従って、select-atts以外の属性の特殊化を行わずに運用しているとは到底思えないのですが?それとも特殊化はコストが高いので@outputclassで実現しているのでしょうか?