ちょっとしたメモ

困ったちゃんのprofile属性

「小文字のsemantic web」やGRDDLを検討していくと、忘れられかけていたhead要素のprofile属性の役割に期待が集まったりするのだが、もういちど仕様を確認して、その使えなさに改めてがっかりするわけだ。仕様書の定義には矛盾があり、具体的な使い方は実装依存で、複数のプロファイルを併用するのは想定外と来ている。まぁ仕方ないか。どれかひとつのプロファイルを記述するとすれば、やはりGRDDLということになるだろう。

今更ながらHTML4仕様書 7.4.1のprofile属性定義を引用してみる。

profile = uri [CT]
This attribute specifies the location of one or more meta data profiles, separated by white space. For future extensions, user agents should consider the value to be a list even though this specification only considers the first URI to be significant. Profiles are discussed below in the section on meta data.

ここで言っているのは、profile属性は (1)URI型の値を取り; (2)ひとつもしくは空白で区切られた複数のプロファイルの場所を示し; (3)この仕様の記述では(複数URIがあっても)最初のひとつだけが意味あるものとして扱うが、将来の拡張を考えてUAは値をリストとして扱うべし; ということだ。この(1)~(3)はそれぞれ矛盾していて、特に困るのがURI型をDTDが次のように定義しているところ。

<!ENTITY % URI "CDATA" -- a Uniform Resource Identifier -->

これは基本的にhref属性などでひとつのURIを記述することを念頭に置いているので、a Uniform Resource Identifierと言ってるわけだが、これじゃ(2)のように複数のURIを書くことができないじゃんか(もっとも、この実体はCDATAなので、空白を挟んでもSGML/XML的には問題なく、実際W3CのValidatorではprofileに複数URIを列挙してもエラーにはならない)。

(2)で複数書いてもいいと定義しておきながら、(3)で「最初のひとつだけが意味あるものとして扱う」と手のひらを返すのもやっかいだね。なぜこんな変な定義になっちゃうかといえば、7.4.4で the same profile applies to all META and LINK elements in the document head とされているのを見てもわかるとおり、複数のプロファイルを持ち出しても、metalink要素で用いるプロパティを区別する術がないからだ(異なるプロファイルで、同じ名前のプロパティを定義していたら、どうしようもないでしょ?)。

最近のGRDDLや「小文字のsemantic web」を巡る議論では、プロファイル何とかならんのかといった話題も出るのだが(たとえばrdf-in-xhtmlにおけるDubostの2004年1月15日付けメッセージから始まるスレッド)、今のところ妙案はない。そういうこともあって、「Metadata in XHTML - XSLTによる抽出」ではprofile属性に頼らず、link要素を使って接頭辞をURIにマップし、この接頭辞によって語彙(プロファイル)を区別するというアプローチをとっているわけだ。

使えないprofile属性は無視してしまっても良さそうな気もするが、W3CのGRDDLデモでは、profile属性をチェックして、そこにGRDDLのURIがある場合にlink要素からXSLTを辿って抽出処理を行うようになっている。というわけで、ひとつだけプロファイルURIを記述するとしたら、GRDDLの http://www.w3.org/2003/g/data-view を優先するのが、たぶん得策だ。

profile属性値URIの意味は、仕様書では二通り示されていて、その1番目は次のようになっている。

As a globally unique name. User agents may be able to recognize the name (without actually retrieving the profile) and perform some activity based on known conventions for that profile.

GRDDLが定めるのは、メタデータをlink要素で指定された変換スクリプトで処理して取り出すという "convention" だ。ということは、個々のプロパティはXSLTのテンプレート経由で(RDFとしての)意味を解釈すると考えることができるから、いろんな語彙を導入しても、「プロファイル」としてはGRDDLが全体をカバーするとみなしてもよかろう。というわけで、profile属性の変な定義で悩むぐらいなら、GRDDLだけを記述しておくのが無難というのが、とりあえずのお薦め。

TantekはXMDP定義のUsing Multiple Profilesセクションで、プロパティ名の衝突がある時はprofile属性に記述された順番で優先順位を決めるという解釈を示しているが、これが一般に通用するという保証はない。

関連メモ: