XHTMLを拡張し、メタデータを直接記述する

XHTMLは名前空間を使って語彙を拡張できますから、RDFなどのメタデータも直接記述することが可能です。RDFとしてまとまった記述でなくても、Dublin Coreの語彙などでパラグラフをマーク付けしておけば、メタデータを容易に抽出できます。この方法をとる場合は、文書型宣言は省いた、整形式XMLとしてのXHTMLを用います。

※このページはまだ検証が必要なテスト段階のものですが、議論の参考に供するために暫定的に公開します。今後、内容を書き換える予定です。

名前空間によるXHTML拡張の準備

XHTMLをはじめとするXMLの言語は、Extensibleの名のとおり、名前空間を使って異なる語彙を組み込み、言語を拡張することができます。複数の名前空間の語彙を利用する場合、DTDを書くのはややこしくなりますが、スキーマに対して検証可能にしなくてよければ、文書型宣言やDTDはとりあえず必要ありません。

XHTMLにDublin Coreのようなメタデータを埋め込むには、この名前空間による拡張がもっともシンプルです。文書型宣言を省いたXHTML文書のhtml要素に、次のように必要な語彙の名前空間宣言を追加します。

(例)

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja" lang="ja">

これだけの準備で、RDF、Dublin Coreの語彙を、(整形式であるかぎり)任意の場所に埋め込むことができます。

RDFを直接埋め込む

普通に記述したRDFのDCメタデータをbody要素内に直接埋め込んでも構いませんが、少し工夫するとより通常のXHTMLに馴染んだメタデータとすることができます。rdf:Description要素の代わりにXHTMLのaddress要素を用い、次のように記述すると、このページ末尾のように、視覚的にも意味の通じるメタデータとなります。

(例)

<rdf:RDF>
 <address rdf:about="http://www.kanzaki.com/docs/sw/meta-in-xh.html">
  <dc:title>XHTMLを拡張し、メタデータを直接記述する</dc:title>
  <dc:date>2003-02-10</dc:date>
  <dc:rights>(c)M. Kanzaki<dc:rightt>
  <dc:creator>神崎正英</dc:creator>
 </address>
</rdf:RDF>

このページをW3CのRDF Validatorで確認すると、上記のRDFがきちんとグラフとして表示され、通常のRDFパーサーがXHTMLに埋め込んだRDFデータを処理できることが分かります(このページでは、次に述べるようにdc:titleをhead要素内に埋め込んでいます。また、テストとしてCreative Commonsのライセンスもhead要素内に組み込んでいます。このほか、続くセクションで検討している埋め込んだRDFを直接テーブル表示させるサンプルも、同じくグラフ表現されます)。

head要素の場合は?

XHTMLのhead要素はそれ自身がメタデータですから、これをそのままRDFとして扱ってしまうのもひとつの手のように思えます。titleなどの要素はプロパティと見なせるので、head要素にrdf:about属性を記述し、(ちょっと強引ですが)head要素全体をrdf:RDF要素で囲んでやります。

(あまり良くない例)

<rdf:RDF>
 <head rdf:about="">
  <title>XHTMLを拡張し、メタデータを直接記述する</title>
  <link rel="contents" href="/" />
  <link rel="copyright" href="/info/disclaimer" />
  ...
 </head>
</rdf:RDF>

RDFパーサーは確かにこの部分をRDFとみなして解析してくれるので、うまく行きそうな感じですが、link要素などのhref属性は、rdf:resourceと違って目的語ノードと解釈されず、次のようなモデルができてしまいます。

[http://..]--xhtml:link-->[ ]--xhtml:rel-->[contents]; --xhtml:href-->'/'

head要素内にrdf:RDF要素を記述し、その中にRDFとして使っても問題ない要素(実質的にはtitleのみですが)を書いてしまうこともできます。ここには、dc:sourceやCreative Commonsのライセンスなどリソースを参照するタイプのメタデータを併記しても良いでしょう。トリッキーな方法としては、title要素内で改めてデフォルト名前空間をDCのものとして宣言すると、(名前空間を厳密に解釈しない)一般のブラウザには文書のタイトルのように見せつつ、RDFパーサーではDCのtitleとして扱わせることもできるようです。

(例)

<head>
 <rdf:RDF>
  <rdf:Description rdf:about="">
   <title xmlns="http://purl.org/dc/elements/1.1/">
    XHTMLを拡張し、メタデータを直接記述する
   </title>
   <cc:license rdf:resource="http://creativecommons.org/licenses/by-nc-sa/1.0"/>
  </rdf:Description>
 </rdf:RDF>
 <link rel="contents" href="/" title="The Web KANZAKI" />
 ...
</head>

ここにdc:dateなどリテラル文を内容として持つ要素を記述すると、ブラウザによってはその文字列が画面に表示されてしまうことがあります。リソースを参照するプロパティはhead要素内、リテラル値を持つプロパティ要素はaddressなどと使い分けるのも一案です。

フレーズのマーク付けにDC語彙を用いる

拡張した語彙は、文書自身のメタデータばかりでなく、本文中のフレーズをマーク付けして異なるリソースのメタデータを示すためにも使えます。例えば書評日記に記されている書籍名などを、Dublin Coreの語彙を使ってマーク付けすると、XHTMLから書評されている作品の書誌データを簡単に抽出できるようになります。

(例)

<p id="review01" class="BookReview"><dc:creator>ティム・バーナーズ=リー</dc:creator>の『<dc:title>Webの創成</dc:title>』(<dc:date>2001-09-01</dc:date><dc:publisher>毎日コミュニケーションズ</dc:publisher><dc:identifier>ISBN:4-8399-0287-9</dc:identifier>)を読む。<dc:description>この本は、WWWの発明者であるバーナーズ=リーが…</dc:description></p>

head要素やaddress要素に記述した文書の作者(書評日記の評者)のデータと合わせると、誰によるどの書籍の書評がどこにあるかという、いわゆる「書評リンク」の生成にも役立つことでしょう。

XHTMLの中に異なる語彙を埋め込んでも、通常のブラウザは理解できないタグは無視するので、表示には影響しないというのもメリットです(Netscape Navigator 2.0などの古いものや、テキストブラウザでも問題は生じません)。おまけに、スタイルシートでたとえば dc\:title {font-weight:bold} という具合に指定すれば、それぞれの項目を好みのスタイルで表示することもできます。

ティム・バーナーズ=リーの『Webの創成』(2001-09-01 毎日コミュニケーションズ ISBN:4-8399-0287-9)を読む。この本は、WWWの発明者であるバーナーズ=リーが…

RDFをスタイルシートでテーブルとして表示する

CSS2のdisplayプロパティを使えば、任意の要素をテーブルとして表示させることができます。以下のRDFデータは、Firefox、OperaなどCSS2とCSS3名前空間モジュールに対応するブラウザではテーブルとして表現されるはずです。

書籍名著者出版社出版年 Webの創成 ティム・バーナーズ=リー 毎日コミュニケーションズ 2001 ベートーヴェン研究 児島新 春秋社 1985

ただし、残念ながらCSS2のテーブル表示には未対応のブラウザが多いので、この手法についてはまだ検討が必要です。

注意点、関連事項、未解決な問題など

実体参照
XHTMLのDTDを参照しない場合、&copy;などのXHTMLで定義されている実体参照は用いることができません。
URI参照とフラグメント識別子

複数の名前空間の語彙を混在させる時、#fragmentで示されるIDが何であるのか明確ではありません。#fragmentの解釈はMIMEタイプで決まることになっているので、とりあえずそれに従えばよいのですが、では<rdf:Description rdf:ID="fragment">はどうなっちゃうのか。

これに関連して、XHTMLにRDFを埋め込む場合のルールについての提案がバーナーズ・リーから出されています[TBL2002]

  • XHTMLプロセッサは、埋め込まれている全てのRDFを無視する
  • RDFプロセッサは、XHTML内の全てのRDFを、RDF文書内に記述されているかのように処理する
  • RDFプロセッサは、RDFを含んでいる(の外側にある)XHTML部分を無視する

こうなると、XHTML文書のどこにでもRDFを埋め込んで構わないことになりますが、ここで検討したようなRDFの内容をXHTMLのブラウザ表示にも利用するという方法は非推奨ということになってしまいます。

名前空間URIで参照するドキュメント
名前空間URIは実際のリソースを取得できることもあれば、単なる識別子で何も取得できないことがあります。ここに、人間も読みやすく、マシンも必要なドキュメント(スキーマなど)を取得できる文書を置くため、[RDDL]という言語が提案されています。これも、XHTMLの中にマシン処理用の(メタ)データを、rddl:resourceという別名前空間の語彙として埋め込むものです。これは現在のところ、XHTML Basicを拡張し、XLinkでリソースを記述するという形で定義されています。
W3Cの "RDF in XHTML Taskforce"
W3CでもRDFをXHTMLに直接埋め込む方法を検討するタスクフォースが結成され、集中的な検討を始めました[RDF-XH-TF]

参考リソース

[TBL2002]
Tim Berners-Lee, Embedding RDF in HTML - a TAG subissue, , Proposal
<http://www.w3.org/2002/04/htmlrdf>
[RDDL]
Jonathan Borden and Tim Bray, Resource Directory Description Language (RDDL),
<http://www.rddl.org/>
[RDF-XH-TF]
Joseph Reagle, RDF in XHTML, , W3C RDF in XHTML Taskforce, Task Force Document
<http://www.w3.org/2003/03/rdf-in-xml.html>