schema.org で表すパンくずリストの構造を理解する

schema.org のイメージ

Google は 2015 年 6 月 15 日から schema.org の提唱するパンくずリストの構造化データに対応しました。 単に、パンくずリストに構造化データを埋め込む場合には、 Google の公式のサンプルに倣えば良いでしょう。 ここではパンくずリストの構造化データの内、分かりにくそうな点について解説します。

Breadcrumbs - Google Developers / Structured Data

構造化データの書式と解析結果

Google が提要するパンくずリストの構造化データ(schema.org 形式)は次のようになります。 このコードは説明のためにパンくずの要素を 1 つにしていますが、実際には 2 つ 3 つのデータが含まれることになります。

<ol itemscope itemtype="http:\/\/schema.org/BreadcrumbList">
  <li itemprop="itemListElement" itemscope
      itemtype="http:\/\/schema.org/ListItem">
    <a itemprop="item" href="https:\/\/example.com/arts">
        <span itemprop="name">Arts</span></a>
    <meta itemprop="position" content="1" />
  </li>
</ol>

Google が示すパンくずリストの例 (microdata 形式 2015.06)

このコードを Google の構造化データテストツールで試験すると、 解析されたデータは概ね次のようになります。

  • BreadcrumbList
    • itemListElement[ListItem]
      • name : Arts
      • position : 1
      • item[Thing]
        • url : https://example.com/arts

構造化データの解析結果

解析結果を上から順に読み進めると次のようになります。

  1. BreadcrumbList 型のプロパティ itemListElement には、ListItem 型の値が入る。
  2. li 要素は BreadcrumbList 型のプロパティ itemListElement の値で、ListItem 型を示す。
  3. ListItem 型のプロパティは item, name , position の 3 つである。
  4. item プロパティの値は https://example.com/arts である。
  5. name プロパティの値は Arts である。
  6. position プロパティの値は 1 である。

ここで扱いが難しいのは 4 番の item プロパティと、その値の関係です。 特にThing 型であることを明示していませんが、この例で指定される URL は Thing 型のプロパティとして識別されています

a 要素に指定された itemprop の値は URL

itemprop 属性が示すプロパティの値は、次のいくつかの条件のうち、最初に該当したものになります。

  1. 要素が itemscope を持っているときは、その要素が持つ要素。
  2. meta 要素のときは、content 属性の値。
  3. audio, embed, iframe, img, source, track, video 要素のときは、src が示す URL。
  4. a, area, link 要素のときは、href が示す URL。
  5. object 要素のときは、data が示す URL。
  6. data 要素のときは、要素が示す値。(空の文字列でも良い)
  7. meter 要素のときは、要素が示す値。(空の文字列でも良い)
  8. time 要素のときは、要素がしめす、datetime の値。
  9. それ以外のときは、要素が示すテキスト。

詳細については W3C が公開してる資料を参考にしてください。

5.3 Names the itemprop attribute - W3C / HTML Microdata 5.4 Values - W3c / Microdata

プロパティと値の継承

Thing 型であることが明示されていないにもかかわらず、 URL が Thing 型の url プロパティの値として設定されている理由について解説します。

結論から述べると、item プロパティは Thing 型を要求するためです。 この例では、URL は item プロパティの値として設定されています。 Thing 型は url プロパティを持っているので、 item プロパティに指定された値は、暗黙的に、Thing 型の値であることが示されたことになります。

混乱する要因は他にもあります。すべての型は Thing 型を継承していて、 すべての型は Thing 型に定義されるすべてのプロパティを継承します。

つまりこの例では、ListItem 型の item プロパティは Thing 型を要求するものの、同時に ListItem 型自身が Thing 型の値を持つことができます。 特に明示されていない Thing 型の url プロパティよりも、ListItem 型の url プロパティを示したほうが自然であるように見えてしまいます。 あるいは、url プロパティを明示する必要があるように見えてしまいます。

先の解説の通り、この例では item プロパティの値として URL が設定されていたので、ListItem 型ではなく Thing 型の url プロパティとして見なされました。

仮に <a itemprop="item url" href="https://example.com/arts"> として、item プロパティの他に url プロパティを明示するとき、 URL は、itemListElement(ListItem 型) の url プロパティと、item(Thing 型) の url プロパティの値として処理されます。 つまり、値の重複を招いています。

Reference