ちょっとしたメモ

コメントにするならXMLでなくてもいいのでは

C.C.ライセンスやウェブログページでは、RDFのメタデータをコメント内に埋め込むという手法がしばしば用いられるわけだが、それなら冗長なXML構文ではなく、Turtleなどを使った方が簡単じゃないかな。ちょうど、はてなのAccount Auto-Discoveryの件もあることだし、少し考えてみよう。

Account Auto-Discoveryの7月28日付の仕様では、次のようなRDF/XMLをコメントとして埋め込む例が示されている。

(例)

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:foaf="http://xmlns.com/foaf/0.1/">
<rdf:Description rdf:about="http://www.hatena.ne.jp/info/perl/autodiscovery/test">
  <dc:creator>
    <foaf:Person>
      <foaf:holdsAccount>
        <foaf:OnlineAccount foaf:accountName="hatena">
          <foaf:accountServiceHomepage rdf:resource="http://www.hatena.ne.jp/"/>
        </foaf:OnlineAccount>
      </foaf:holdsAccount>
    </foaf:Person>
  </dc:creator>
</rdf:Description>
</rdf:RDF>

これがコメントになっていると何が嬉しくないかについては、檜山さんが「コメントアウトはやめてくれ」などで丁寧に説明されている。コメントは削除されちゃうかも知れないし、コメント内を抜き出すことができても、そこはただの文字列なので、もう一度XMLパーサに投げたり、アプリケーションが独自に内容を解析しなくちゃならないということ。

たとえば、XSLTでコメントからRDFを再構成するにはえらく複雑な手順が必要で、それでも完璧には行かない。しかも、実際に試してみると、XHTMLと名乗っているページが実は整形式でないことが非常に多く、XMLツールを使うメリットはほとんど無いも同然という感じだ。

で、このようなRDF/XMLからどんな情報を取り出したいのかというと、Account Auto-Discoveryの場合は (1)rdf:about にあるリソースURI; (2) hatena というアカウント名; (3) そのアカウント名のホームページURI; の3つだという。しかもこれを処理するモジュールは、正規表現で該当する部分を抜き出している。それならば、冗長なRDF/XMLにしないで、Turtle/N3のような簡単な構文を使ってもいいのでは。

上のRDF/XMLを、Trutle/N3で記述してみよう。ただし、より簡略にするために、dc:creatorfoaf:makerとし、利用されていないクラス名(foaf:Personfoaf:OnlineAccount)は略すことにする(これらは必要ならスキーマから推論できる)。

(例)

@prefix : <http://xmlns.com/foaf/0.1/> .
<http://www.hatena.ne.jp/info/perl/autodiscovery/test>
 :maker [ :holdsAccount [ :accountName "hatena";
 :accountServiceHomepage <http://www.hatena.ne.jp/> ] ] .

必要な情報がそれぞれの行におさまっているので、抜き出すのも簡単だろう。ページごとに主語のURIを記述するのが複雑なら、主語を<>だけにしたっていい。この場合は(rdf:about=""と同じく)このRDFが含まれる文書自身のURIが主語になる。

(例)

@prefix : <http://xmlns.com/foaf/0.1/> .
<> :maker [ :holdsAccount [ :accountName "hatena";
 :accountServiceHomepage <http://www.hatena.ne.jp/> ] ] .

ほーら、16行も費やしていたのが、わずか3行に圧縮できた ;-)。見慣れない構文でとまどうかも知れないが、これらをコピーしてグラフ表示してみれば、ちゃんとRDFとして機能することが分かるだろう(「上から下」をチェックした方が見やすいグラフになります)。

RDFをXML形式で記述して埋め込むのは、親文書のXHTMLと合わせてXMLパーサで処理できてこそメリットがある。どっちみちコメントにしてしまうのなら、「RDF税」と呼ばれるようなXML構文ではなく、こういうコンパクトなものを考えてみてもいいのではないかな。

〔追記〕XMLじゃないんだから、コメントにするまでもなく、属性値に埋め込むことだってできる。その場合、< >&lt; &gt;にしなければならないが、DOMなどを使って取りだした結果はこれら実体参照が展開された文字列だから、必要に応じてTurtle/N3のパーサに渡してもいいし、正規表現で欲しいデータだけ取りだしてもいい。だから、meta要素にでも書けるし、たとえばmicroformat的に

(例)

<span class='metainfo' title='@prefix : &lt;http://xmlns.com/foaf/0.1/&gt; .
&lt;http://www.hatena.ne.jp/info/perl/autodiscovery/test&gt;
 :maker [ :holdsAccount [ :accountName "hatena";
 :accountServiceHomepage &lt;http://www.hatena.ne.jp/&gt; ] ] .'>
Account Auto-Discovery</span>

なんてのもいいかもね(title属性値がいいのかどうかは議論の余地あり)。Account Auto-Discoveryのところにそれらしいアイコンを置くという手もあるぞ。

関連メモ:
genre: rdf. at