Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

GRDDL

GRDDL (Gleaning Resource Descriptions from Dialects of Languages) はメタデータが埋め込まれた XHTML とメタデータを抽出するルールを記述した XSLT スタイルシートなどを結びつける仕組みです。

Web 上には沢山の情報が存在しますが、大部分は人間が理解できるように HTML 形式で書かれたものです。HTML 形式とは別に、コンピュータが理解できる RDF 形式で情報を提供することをコンテンツ製作者に望むのは、負担が大きくなり難しいでしょう。仮に提供していても、2つの整合性を合わせ続けることは困難です。GRDDL はウェブページから自動的に RDF を生成する手段として利用することが可能です。

GRDDL を用いれば、XSLT スタイルシートの簡単なルールに従い XHTML を記述することによってそのページの RDF を提供することができます。例えば、XHTML から RSS を抽出するための XSLT スタイルシートが W3C から提供されています。以下にそのスタイルシートの一部を示します。

 1:<xsl:for-each select='.//h:div[@class="item"]'>
 2:  <xsl:variable name="itemURI">
 3:    <xsl:call-template name="uri:expand">
 4:      <xsl:with-param name="there" select='.//h:a[@rel="details"]/@href'/>
 5:      <xsl:with-param name="base" select="$Base"/>
 6:    </xsl:call-template>
 7:  </xsl:variable>
 8:  <item rdf:about="{$itemURI}">
 9:    <title>
10:      <xsl:choose>
11:        <xsl:when test="h:h2">
12:          <xsl:value-of select='normalize-space(h:h2)'/>
13:        </xsl:when>
14:        <xsl:otherwise>
15:          <xsl:value-of select='normalize-space(h:h3)'/>
16:        </xsl:otherwise>
17:      </xsl:choose>
18:    </title>
19:    <description>
20:      <xsl:value-of select='normalize-space(h:p)'/>
21:    </description>
22:    <link><xsl:value-of select="$itemURI"/></link>
23:    <xsl:variable name="dateElt" select='h:p/*[@class="date"]'/>
24:    <dc:date>
25:      <xsl:choose>
26:        <xsl:when test="contains(normalize-space($dateElt),' ')">
27:          <xsl:call-template name="hr:format-date">
28:            <xsl:with-param name="DDMonthYYYY" select="translate($dateElt,':','')"/>
29:          </xsl:call-template>
30:        </xsl:when>
31:        <xsl:when test="contains($dateElt,'-')">
32:          <xsl:value-of select="translate($dateElt,':','')"/>
33:        </xsl:when>
34:      </xsl:choose>
35:    </dc:date>
36:  </item>
37:</xsl:for-each>

接頭辞となっている dc:, h:, uri:, rdf: はそれぞれ Dublin Core, XHTML, URI, RDF の名前空間に結び付けられていて、接頭辞のない要素は RSS の名前空間に属しています。ここではスタイルシート解説は行いませんが、このスタイルシートでは RSS の item 要素と XHTML の <div class="item"> 要素を対応させています(1行目)。そのため、コンテンツ製作者は RSS の item として抜き出してほしい情報を <div class="item"> 要素としてまとめればよいということになります。例えば、XHTML の一部分に

<h1>コンテンツを更新!</h1>
<p>
  花粉症対策についてまとめてみました。(2005-04-12) 
  → <a href="http://www.4dd.co.jp/contents/">コンテンツページへ</a>
</p>

という記述があり(要素はすべて XHTML の名前空間に属しているとします)、これを RSS の item として抜き出したい場合は、

<div class="item">
  <h1>コンテンツを更新!</h1>
  <p>
    花粉症対策についてまとめてみました。(2005年04月12日) 
    → <a href="http://www.4dd.co.jp/contents/">コンテンツページへ</a>
  </p>
</div>

とすればよいということになります。さらに、item に関して詳細に記述しているページへのリンクを <div class="item"> 要素に含まれる <a> 要素の中から抽出します。抽出ルールは rel 属性の値が "details" である <a> 要素の href 属性です(4行目)。そのため、item に関する詳細情報があるページへのリンクが "http://www.4dd.co.jp/contens/" ならば、

<div class="item">
  <h1>コンテンツを更新!</h1>
  <p>
    花粉症対策についてまとめてみました。(2005年04月12日) 
    → <a href="http://www.4dd.co.jp/contents/" rel="details">コンテンツページへ</a>
  </p>
</div>

と記述することでリンクを抽出できます。同様に、item のタイトルは <div class="item"> 要素に含まれる <h2> か <h3> 要素に対応し(12行目、15行目)、item の説明は <div class="item"> 要素の最初の <p> 要素に対応し(20行目)、item の更新日時情報は <div class="item"> 要素の <p> 要素に含まれる class 属性が "date" のもので DDMonthYYYY (12Apr2005) や YYYY-MM-DD といったフォーマットに従った要素に対応します(23行目)。この対応ルールに従い XHTML を書き換えると、

<div class="item">
  <h2>コンテンツを更新!</h2>
  <p>
    花粉症対策についてまとめてみました。(<span class="date">2005-04-12</span>) 
    → <a href="http://www.4dd.co.jp/contents/" rel="details">コンテンツページへ</a>
  </p>
</div>

となり、この XSLT スタイルシートに従い RSS に変換を行うと、

<item rdf:about="http://www.4dd.co.jp/contents/"
      xmlns:dc="http://purl.org/dc/elements/1.1/"
      xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns="http://purl.org/rss/1.0/">
  <title>コンテンツを更新!</title>
  <description>
    花粉症対策についてまとめてみました。(2005-04-12)
    → コンテンツページへ
  </description>
  <link>http://www.4dd.co.jp/contents/</link>
  <dc:date>2005-04-12</dc:date>
</item>

となります。簡単なルールに従って XHTML を記述することによって RSS を自動作成できることがわかります。

それでは、GRDDL により XHTML と XSLT スタイルシートとの関連付けを行う方法を示します。まず、XHTML の <head> 要素に "data-view" プロファイルを指定します。

<head profile="http://www.w3.org/2003/g/data-view">

このプロファイルには transformation というリンクタイプが定められており、以下のような <link> 要素を <head> 要素に記述することで XHTML と XSLT スタイルシートとの関連付けを行えます。

<link rel="transformation" href="http://www.w3.org/2000/08/w3c-synd/home2rss.xsl" />

今回は、先ほど例で示した XHTML から RSS を抽出するための( "http://www.w3.org/2000/08/w3c-synd/home2rss.xsl" にある)XSLT スタイルシートを用いましたが、その他の XSLT スタイルシート( GRDDL を利用するアプリケーションさえ理解していれば XSLT スタイルシートである必要もない)を用いる場合は、href 属性にスタイルシートが存在する URI を記述してやります。この <link> 要素を複数列挙し、複数の XSLT スタイルシートを使用することも可能です。

先ほどの例では既存の XSLT スタイルシートを用いましたが、RSS を抽出するという同じ目的でも独自のスタイルシートを使うことが考えられます。独自のスタイルシートを用いることで、元のページデザインをほとんど崩さなくてもよい、相対リンクアドレスに対応させることができる、といった利点が挙げられます。以下に、実際にサイトに適用した例を示します。

  • 対象となるウェブページ http://www.techscore.com/news.html
  • 適用するスタイルシート http://www.techscore.com/rss/news-grddl.xsl

ここでは Techscore というサイトの更新情報ページから RSS ファイルを自動生成しています。次に、先ほどから利用している XHTML から RSS を抽出する XSLT スタイルシートを、対象となる XHTML に合うように変更し、独自の XSLT スタイルシートを作成しています。XHTML 文書の link 要素ではこのスタイルシートを利用してページを変換するよう link 要素で指定しています。GRDDL を利用して生成した RSS は、事前に作成したものを RSS ファイルとしても置いています。



  TECHSCOREのTOPページへ  
techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa