属性追加の欲望(1)

どうしてもOASIS標準の要素に自分たちで使用したい属性を付けたい場合があります.端的な例としてxrefがあるのではないでしょうか?例えばxrefがtopicを指す場合、

- topic/titleを""で囲んで表示(title-only)
- topic/titleを""で囲み次いでページ番号を表示(title-and-page)
- titleのページ番号のみ表示(page-only)

などと出し分けたい場合が確実にあります.しかしこのような属性はOASISの仕様では定義されていません.

3.2.2.40 <xref>

3.12.8 Link relationship attribute group

後者で@formatはリンク先のフォーマットです.@typeはリンク先が例えばtopicであるのか、fig,tableであるのかなどリンク先の種類を表します.つまり、xrefをどのように表示(出力)するのかというのはimplementation dependedとなります.ですので多くの場合取られる手段が汎用のoutputclassを使って識別するやり方です.例えば

<xref href="~.diata" format="dita" type="topic" outputclass="title-only"/>
<xref href="~.diata" format="dita" type="topic" outputclass="title-and-page"/>
<xref href="~.diata" format="dita" type="topic" outputclass="page-only"/>

という具合になります.これで十分機能するのですが、outputclassは汎用のスタイリング属性なので、パーサーによる検証で入力値を限定するということはできません.

3.12.9 Other common attributes

更に、すべてを@outputclassで吸収しようとしだすと、とても1属性だけでは足りなくなることがよくあります.ですので望まれるのは例えば次のようにxref/@outformatなどという属性を追加定義して記述できるとありがたいです.入力ミスも確実になくすことができます.

<xref href="~.diata" format="dita" type="topic" outformat="title-only"/>
<xref href="~.diata" format="dita" type="topic" outformat="title-and-page"/>
<xref href="~.diata" format="dita" type="topic" outformat="page-only"/>

このようなことはDITAの属性の特殊化でできるのでしょうか?残念ながらOASISの特殊化のガイドラインではこのようなことは推奨されていません.

2.5.3.5 Specialization rules for attributes

属性は@propsか@baseから特殊化しなくてはなりません.ここで@propsはフィルタリング属性です.@baseがフィルタリングのみに使用しなくても良いのですが、しかし

It is declared as a global attribute. Attribute specializations cannot be limited to specific element types.

ということで汎用の属性でなければならず、特定の要素タイプに使用を限定してはならないのです.大抵の場合、ここであきらめてしまうのではないでしょうか?つまり、このDITAの厳しい特殊化の制約に従っていては、現場のお客様の要求に答えることができないからです.なのでついついOASISの提供しているスキーマ/DTDを公開識別子を変えることはしても、次のように@outformatを追加してしまいたくなります.

DTDの場合]
<!ENTITY % xref.attributes
             "href 
                        CDATA 
                                  #IMPLIED
              keyref 
                        CDATA 
                                  #IMPLIED
              type 
                        CDATA 
                                  #IMPLIED
              format 
                        CDATA 
                                  #IMPLIED
              scope 
                        (external | 
                         local | 
                         peer | 
                         -dita-use-conref-target) 
                                  #IMPLIED
              outformat 
                        (title-only | 
                         title-and-page | 
                         page-only | 
                         -dita-use-conref-target) 
                                  'title-only'
              %univ-atts;
              outputclass 
                        CDATA 
                                  #IMPLIED"
>

このOASISガイドラインと現場でのインプリメンテーションの軋轢はやはりDITAの実践で直面せざるを得ない問題と思います.DITAは可搬性を重視しています.実際いじくりまわしたDocBookのインスタンスは決してそのシステムを離れて使うことはまず不可能です.しかしガイドラインに基づいて特殊化したDITAのインスタンスは、他のシステムでも最低限の処理を通すことができるからです.

今使っているDITAは本当に自分たちだけのものか?というと必ずしもそのような保証はありません.企業がグローバル化する中で、ある日突然の企業の合併吸収で、他人のDITAを自分のDITAと統合しなければならない場面も出てきかねません.

やはり標準に沿って自分たちのDITAを作るというのは必要なことでしょう.では既存の特定の要素に如何にして属性を追加するのか?最近のdita-usersの話を紹介したいと思います.