複数のVocabulary(語彙)をマークアップする点においてのMicrodataとRDFa(RDFa Lite)

このエントリーは、HTML5 Advent Calendar 2013向けに書いたものです。

アクセシビリティのため、SEOのために構造化されたHTMLは大事とよく言われます。そのため、ダブリン・コアFOAFSchema.orgなどで定義されているVocabulary(語彙)を使ってマークアップする機会も増えていくことでしょう。

ダブリン・コアやFOAF、Schema.orgなどの語彙を使う場合には、RDFa(RDFa Lite)やMicrodataを使ってマークアップをします。しかし、場合によればSchema.orgで定義されている語彙と組み合わせて他の語彙を使う場合もでてくるかもしれません。

ここでは、ダブリン・コアやFOAF、Schema.orgなどの語彙を複数使うにはMicrodataとRDFa(RDFa Lite)どちらが良いのだろうかと疑問に思ったことを書いていきます。

RDFa

ダブリン・コア、FOAFなどの語彙を追加する記述方法として以前からRDFaがあります。RDFaを意識したことはなくとも多くの人がFacebookのいいねボタン向けに下記のソースコードのようにOGPの指定でprefixpropertyを使ったご経験があるかと思います。

<html 
   lang="ja" 
   prefix="og: http://ogp.me/ns# 
           fb: http://www.facebook.com/2008/fbml">
<head>
<meta property="og:title" content="something title">
<meta property="og:url" content="http://ex.com">
<meta property="og:description" content="something description">
<meta property="fb:app_id" content="12345678901234">

prefixpropertyは、RDFaで定義されている仕様です。そして、urldescriptionなどはogp.me、app_idはhttp://www.facebook.com/2008/fbmlで定義されている語彙です。

余談ですが、HTML5のHTMLシリアライゼーションでマークアップをしている場合、xmlns:og="http://ogp.me/ns#"としているとバリデーションエラーになりますので、エラーを回避するためには、上記のようにprefixを使う必要があります。

Microdata

RDFaと同じような仕様としてMicrodataがあります。Microdataは、itemsopeitemtypeitempropitemrefitemidの5つの属性で成っており、非常にシンプルな構成となっています。また、Googleも推奨していることもあって、すでに使っている人も多いのではないかと思います。

下記は、Schema.orgをMicrodataである人物の情報をマークアップした例です。

<div 
  itemscope 
  itemtype="http://schema.org/Person" 
  itemref="org">
  <span itemprop="name">帆下 掘外男</span>
  <time datetime="1977-05-25" itemprop="birthDate">1977年5月25日</time>
  <span itemprop="address">M県S市紅葉区杜王町</span>
  <span itemprop="telephone">03-1111-2222</span>
  <span itemprop="faxNumber">03-1111-2222</span>
  <span itemprop="email">hoge@ex.com</span>
</div>
<div id="org">
<p>
<span itemprop="affiliation">hoge社</span>に勤めています。
</p>
</div>

RDFa Lite

RDFa Liteは、RDFaを単純化したもので、vocabtypeofpropertyresourceprefixの5つの属性で成っています。Microdataと同じくらいシンプルな構成となっており、仕様を理解するのに一日もかからないでしょう。

RDFa Liteで定義されている属性は、RDFaのサブセットですので、RDFa LiteはRDFaと上位互換があります。GoogleはMicrodataを推奨はしているとはいえ、RDFaもサポートしていますので、RDFa Liteで実装してもSEOの観点からみれば効果は同じでしょう。

下記のソースコードは、上記のMicrodataでマークアップしたものをRDFa Liteに置き換えた例です。

<div 
	vocab="http://schema.org/" 
	typeof="Person" 
	resource="#org">
  <span property="name">帆下 掘外男</span>
  <time datetime="1977-05-25" property="birthDate">1977年5月25日</time>
  <span property="address">M県S市紅葉区杜王町</span>
  <span property="telephone">03-1111-2222</span>
  <span property="faxNumber">03-1111-2222</span>
  <span property="email">hoge@ex.com</span>
</div>
<div id="org">
<p><span property="affiliation">hoge社</span>に勤めています。</p>
</div>

Multiple Vocabularies

さて本題の複数の語彙を使う場合にはMicrodataとRDFa(RDFa Lite)どちらが良いのだろうかと疑問の思っていろいろ調べたことです。ここでの前提として、HTML文章内にひとつのitemscopevocabを使うこととしています。

RDFa(RDFa Lite)を見てみる

RDFa(RDFa Lite)は、2.1.5 Using Multiple Vocabulariesの項目にあるように、仕様に盛り込まれています。

また、RDFa Liteの仕様書にも、prefixの箇所に書かれています。

RDFa(RDFa Lite)だとprefixに、使用する語彙を指定します。下記の例では、OpenVocabの語彙を使って、Skype ID、twitter IDを追加しています。

※:schema.orgには、Skype ID、twitter IDを指定する語彙がないため、目的を果たすために別の語彙を使って表現をします。

<div 
	vocab="http://schema.org/" 
	typeof="Person" 
	resource="#org" 
	prefix="ov: http://open.vocab.org/terms/">
  <span property="name">帆下 掘外男</span>
  <time datetime="1977-05-25" property="birthDate">1977年5月25日</time>
  <span property="address">M県S市紅葉区杜王町</span>
  <span property="telephone">03-1111-2222</span>
  <span property="faxNumber">03-1111-2222</span>
  <span property="email">hoge@ex.com</span>
  <span property="ov:skypeID">hogeskype</span>
  <span property="ov:twitter-id">hogetweet</span>
</div>

Microdataを見てみる

Microdataには、RDFa(RDFa Lite)のprefixと同等の機能がありません。

2011年の記事なので少し古いのですが、Multiple itemtypes in Microdataという記事にMicrodataの問題として、「ひとつのitemtypeにはひとつの要素に限られている」とあります。

microdata is limited to a single itemtype per element.

他の記事にもMicrodataでは複数の語彙が使えないとあります。

これらを読む限り、itemtypeには、ひとつしか指定できないため、itemscopeの範囲内では、ひとつの語彙しか使えなさそうです。一方、RDFa(RDFa Lite)は、vocabで指定した語彙以外に、prefixを使えば、複数の語彙を使うことができます。さらにprefixの良い点は、prefixには、ひとつ以上の語彙を指定することができるため、3つ以上の語彙を用いることも可能です。

ここまで見る限り、複数の語彙を使う場合は、RDFa(RDFa Lite)を使うほうが良さそうに感じます。

しかし、WHATWGの仕様書の例を見ると、itemtypeに複数の指定をしています。


<dl itemscope itemtype="http://md.example.com/loco 
                        http://md.example.com/lighting">
 <dt>Name:
 <dd itemprop="name">Tank Locomotive (DB 80)

この例を見るとひとつのitemtypeにはひとつの要素に限られていないということになります。なので、複数の語彙に対応している。以上!!

と、なればアレがソレでソレがアレ(ナニ)なのですが、上記の例では、複数の語彙のように見えてしまうのですが、語彙が同じでTypeが複数ということです(itemtypeなのでTypeのみの指定になるのは当然といえば当然なのですが...)。上記の例だとitemtypeが複数の語彙に対応しているのか判断が難しいです。多くの文献では未サポートというのを見かけます。

Microdataで複数の語彙の指定

Microdataの仕様書を読む限りでは、複数の語彙への対応の仕方がよく分かりませんが、Extending and Combining Microdata Vocabulariesを読む限り、<meta itemprop="http://n.whatwg.org/alt-itemtype" content="http://open.vocab.org/terms/">を追加して、RDFa Liteの場合にov:skypeIDとしていた箇所をhttp://open.vocab.org/terms/skypeIDとしてやるようです。

<div 
	itemscope 
	itemtype="http://schema.org/Person" 
	itemref="org">
  <meta 
  	itemprop="http://n.whatwg.org/alt-itemtype" 
  	content="http://open.vocab.org/terms/">
  <span itemprop="name">帆下 掘外男</span>
  <time datetime="1977-05-25" itemprop="birthDate">1977年5月25日</time>
  <span itemprop="address">M県S市紅葉区杜王町</span>
  <span itemprop="telephone">03-1111-2222</span>
  <span itemprop="faxNumber">03-1111-2222</span>
  <span itemprop="email">hoge@ex.com</span>
  <span itemprop="http://open.vocab.org/terms/skypeID">hogeskype</span>
  <span itemprop="http://open.vocab.org/terms/twitter-id">hogetweet</span>
</div>

http://n.whatwg.org/alt-itemtypeを調べても何もでてこないので仕様として生きているのかどうか不明ではありますが、Extending and Combining Microdata Vocabulariesには、itemscopeにはalt-itemtypeプロパティが含まれており、こうすることにより、独立した2つのitemtypeが作られるとあります。Microdataで複数語彙を使う場合は、このように指定するようです。

また、 Can microdata support multiple vocabularies? Using Multiple Vocabularies in Microdataを読むと、先ほどのmeta要素ではなくて<link itemprop="http://www.w3.org/1999/02/22-rdf-syntax-ns#type" href="http://vcab.foo.com/">を追加するとあります。しかし、これらを読む限りでは、「別のタイプを宣言」と書いてあるので、異なる語彙のことも指すのかどうかはこれらの文献で読みとることができませんでした。

まとめ(というかほぼ雑感)

Microdataでも複数の語彙の使用は一応大丈夫のようですが、仕様的に本当に正しいのかどうか不明な点があるのと適用の仕方がなんともメンドクサイという印象です。仕様書も分かりにくいです。
一方、RDFa(RDFa Lite)は、prefixに指定すればいいだけですので、仕様書を読めばすぐに理解できるレベルです。また、RDFa Liteは非常にシンプルな仕様ですので、学習コストもそこまで高くありません。なので、複数の語彙を使う点においては(語彙をひとつだけを使う点においても)、現時点ではRDFa Liteを使うほうが後々便利かもしれないという印象です。

参考