ちょっとしたメモ

metaprofのブロックレベル要素処理を強化

metaprofをプロファイルに指定してGRDDLで処理するとき、ブロックレベル要素に接頭辞付@class属性値を用いると型付ノード要素を生成しますが、文書自身とこのノードをfoaf:topic以外のプロパティで結び付けたいという要望を見かけたので、対応してみました。@classに、プロパティをあらわす値を付け加えるだけで、任意のプロパティを利用できます。

要望であげられていた例を使うと、

(例)

<dl class="prism.isTranslationOf foaf.Document">
 <dt>Original Page</dt>
  <dd><a href="http://www.alistapart.com/articles/previewofhtml5"
         class="about">A List Apart:  Articles: A Preview of HTML 5</a></dd>
 <dt>Author</dt>
  <dd><a rel="creator" href="http://lachy.id.au/">Lachlan Hunt</a></dd>
 <dt>Copyright</dt>
  <dd><a rel="rights" href="http://www.alistapart.com/copyright/">Copyright &copy;</a>
  1998-2008 A List Apart Magazine and the authors.</dd>
</dl>

上記のように記述すれば、以下のRDFグラフが得られます(最初のfoaf:DocumentはXHTML文書自身です)。〔追記〕型付ノード要素の主語(rdf:about)にするa要素は、class="about"としてください。慌ててrel="about"と書いていたのを修正しました)。

(例)

<foaf:Document rdf:about="">
 ...
 <prism:isTranslationOf>
  <foaf:Document rdf:about="http://www.alistapart.com/articles/previewofhtml5">
   <rdfs:label>A List Apart: A Preview of HTML 5</rdfs:label>
   <dc:creator>
    <foaf:Agent>
     <rdfs:label>Lachlan Hunt</rdfs:label>
     <foaf:homepage rdf:resource="http://lachy.id.au/"/>
    </foaf:Agent>
   </dc:creator>
   <dc:rights>
    <rdf:Description rdf:about="http://www.alistapart.com/copyright/">
     <rdfs:label>Copyright</rdfs:label>
    </rdf:Description>
   </dc:rights>
  </foaf:Document>
 </prism:isTranslationOf>
</foaf:Document>

(ここで、foaf:dc:はあらかじめmetaprofで定義しているので直接foaf.dc.としてXHTMLの@class属性値で使えますが、prism.は未定義なので、XHTMLのlink要素で rel="schema.prism" href="..." という形で指定しておく必要があります)

ブロックレベル要素の@class属性の扱いは、ピリオドを含む(以下、接頭辞付き)名前かどうかで次のようになっていました。

  1. 属性値が大文字で始まる(Bookなど)か、接頭辞+大文字で始まる値(foaf.Documentなど)なら、型付ノード要素とする
  2. 属性値が接頭辞+小文字で始まる値(prism:isTranslationOf!など)ならプロパティ要素として、内容をリテラル値にする
  3. それ以外の@class値は無視する(abstractなどの予約値は別)

今回、1.と2.を合わせる形で、新しい規則を追加します。

  • 属性値が接頭辞付き名を含むとき、1つ目が接頭辞+小文字開始名、2つ目が接頭辞+大文字開始名ならば、それぞれをプロパティ要素型付ノード要素とする

接頭辞付き名前の順序を逆にする(1番目を接頭辞+大文字開始名とする)ことはできませんが、この順序さえ正しければ、それ以外の名前(クラス属性値トークン)が含まれても構いません。なお、2つめのトークンとして、接頭辞のない大文字で始まる値(Bookなど)を用いても、型付ノード要素は生成されないので注意してください。

また、例で強調しているのは、要望のオリジナルから書き換えている部分ですが、@rel属性をうまく使うことで、型付ノード要素の中の情報を、リテラルではなくリンク可能なデータとして表現できます。

関連メモ:
map - at