Metadata in XHTML - XSLTによる抽出

XHTMLの属性を利用してメタデータを埋め込めば、別途RDFファイルを作成・管理することなく、簡単かつ的確に意味情報を伝えることができます。このとき、属性値に接頭辞を加え、標準的手段で名前空間とマッピングしておけば、意味が明確で処理のための予備知識も不要になります。この接頭辞方式メタデータ埋め込みと、そこからXSLTを用いてRDFを生成する汎用的な方法を検討します。

Embedding metadata in XHTML attributes is a good approach for easy, efficient "lowercase semantic web". With the standard way to map prefixes to schema namespaces, the semantics become much clearer and arbitrary vocabulary can be added without prior knowledge. Appropriate XSLT will generate an RDF from these attributes. *Most parts of this document are written in Japanese, but you'll find a short English summary at the beginning of each section.

Summary: 概要

When putting metadata in attributes of XHTML elements, use prefix according to RFC 2731. This approach extends this method to general elements in body, by assigning prefixed values to class attributes. Metadata is generally regarded as that of the document itself, while special class="me" denotes data within the paragraph as that of the author. Also, by assigning Camel name or prefixed class value to a block level element, data within that paragraph is regarded as that of the topic mentioned there. Those metadata can be extracted and transformed to an RDF with XSLT. Complete XSLT file available.

XHTMLのtitle、meta、linkといったメタデータ要素、および一定のルールに基づいて記述したclass属性やrel属性を持つ要素から、メタデータを抽出してRDFに変換します。このとき、メタデータを記述する語彙を明確にするため、Dublin CoreをXHTMLに記述する[RFC2731]の方法を応用し、link要素と属性値の接頭辞を使って、名前空間URIと結びつけます。

head要素のメタデータは、文書自身に関するもの作者に関するものに分けて扱います。本文中で、接頭辞を持つclass属性はリテラル値のプロパティを、同じく接頭辞付きrel属性を持つa要素は、href属性の値を目的語URIとしたリソースプロパティを生成します。本文から抽出するプロパティの主語は、その要素が属する段落(p要素)のclass属性によって次のように区別して扱います:

さらに、このスタイルシートでは、dfn要素でマーク付けされた語句を文書のキーワードとして抽出します。これらの組み合わせにより、簡単な属性指定だけでXHTMLにグローバルに理解可能なメタデータを埋め込むことができます。

※このページで説明しているXSLTテンプレートを使った実際のXSLTファイルを参照できます。メタデータ埋め込みに関する一般的な検討は、「XHTMLからメタデータを自動抽出する」のページを参照してください。

Document : 文書に関するメタデータ

The document metadata is described in meta and link elements in XHTML head element. Those property names can be prefixed by the RFC 2731 method. For example, use "dc.creator" to describe Dublin Core's 'creator' property, then bind the prefix to its schema uri (namespace) via link element.

XHTML文書に関する基本的なメタデータは、head要素内のmeta要素に記述できますが、単にname="author"としても、この内容が「作者」を示すデータであることは、あらかじめその意味を了解しているアプリケーションにしか解釈できません。そこで、RFC 2731のDublin Coreを(X)HTMLに記述する方法を応用し、linkによる名前空間のマッピングと、接頭辞付きのname属性を利用して、明確なメタデータを記述することにします。たとえば、authorの代わりにDublin Coreのcreatorを使って作者を示してみましょう。

[Ex.1]

<link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
<meta name="dc.creator" content="神崎正英" />

同じ方法は、異なる語彙にも応用できます。たとえば、文書の更新日はHTTPヘッダなどでも取得できますが、作成日は何らかの形で作者が明記しないと知るすべがありません。そこで、Dublin Coreの精密化要素であるcreatedで作成日を示すことにします。

[Ex.2]

<link rel="schema.dcterms" href="http://purl.org/dc/terms/" />
<meta name="dcterms.created" content="2003-12-15" />

このようにして、名前空間のマッピングと接頭辞付きname属性値を用いることで、異なる語彙セットのプロパティを、処理アプリケーションの予備知識を必要とすることなく記述することができます。同じ方法で、link要素のrel属性に接頭辞付きのプロパティ名を記述すれば、href属性値を目的語URIとしたリソース型プロパティも示すことができます。次の例は、文書がクリエイティブ・コモンズのby-nc-sa型ライセンスを採用していることを表します。

[Ex.3]

<link rel="schema.cc" href="http://web.resource.org/cc/" />
<link rel="cc.license" content="http://creativecommons.org/licenses/by-nc-sa/1.0/" />

Namespace: 名前空間と接頭辞のマッピングを生かすXSLT

Prefixed attribute values can be transformed into RDF properties via XSLT. The templates are little bit complex, but can be applied to any vocabulary without prior knowledge.

名前空間と接頭辞をマッピングしてプロパティを記述しているので、ここからRDFのプロパティを生成することが可能です。適切なRDFを生成するXSLTのテンプレートを考えてみましょう。まず、schemaのURIを記述しているlink要素を集めて、簡単にアクセスできるようにグローバル変数に割り当てておきます。

[Ex.4]

<xsl:variable name="schemas"
     select="/h:html/h:head/h:link[starts-with(@rel,'schema.')]"/>

meta要素を処理するテンプレートでは、name属性が接頭辞を持つ(ピリオドを含む)場合、name属性値とこの変数を使って、プロパティの名前と名前空間を決定します。

[Ex.5]

<xsl:template match="h:meta[contains(@name,'.')]">
 <xsl:variable name="pfx" select="substring-before(@name,'.')"/>
 <xsl:variable name="ns" select="$schemas[@rel=concat('schema.',$pfx)]/@href"/>
 <xsl:element name="{translate(@name,'.',':')}" namespace="{$ns}">
  <xsl:value-of select="@content"/>
 </xsl:element>
</xsl:template>

link要素に対しても同様の考え方でRDFを生成するXSLTテンプレートを記述できます。これらを適用すると、例のmeta、link要素からは次のようなRDFを得ることができます。

[Ex.6]

<rdf:Description rdf:about="">
 <dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Masahide Kanzaki</dc:creator>
 <dcterms:created xmlns:dcterms="http://purl.org/dc/terms/">2003-12-15</dcterms:created>
 <cc:license xmlns:cc="http://web.resource.org/cc/"
   rdf:resource="http://creativecommons.org/licenses/by-nc-sa/1.0/"/>
</rdf:Description>

xsl:elementのnameは、ローカル名(名前空間修飾なし)でも構わないのですが、ここでは「.」を「:」に変換し、敢えてQName(接頭辞つき)としています。これによって、RDFプロパティの接頭辞も(ns_1:などではなく)馴染みのあるものにできますし、よく使う名前空間をXSLT自身で宣言していれば、結果ツリーのルート要素にその名前空間がコピーされるので、それに対応するプロパティ要素はxmlns:dcなどの宣言属性がない、すっきりした形になります。

Person: 作者に関するメタデータ

Some metadata in the head element describes the author rather than the document itself. A particular example is a mail address with rev="made". Thoese would be better treated by adding foaf:maker, foaf:Person elements in the document description, and put the metadata inside the foaf:Person. This construct will also be beneficial when extracting personal metadata from the body of XHTML (will show later).

head要素に記述するメタデータのうちいくつかは、文書自身についてというより、その作者に関するデータになっています。代表的なのは、link要素をrev="made"として示すメールアドレスです。

[Ex.7]

 <link rev="made" href="mailto:webmaster@kanzaki.com" />

また、<meta name="author"...といった慣用的なデータも、作者情報(作者の名前)として扱うことができるでしょう。これらは、文書自身のメタデータにfoaf:makerプロパティとfoaf:Person要素を加え、その子要素として記述するといろいろ都合が良くなります。

[Ex.8]

<rdf:Description rdf:about="">
 ...
 <foaf:maker>
  <foaf:Person>
   <foaf:mbox rdf:resource="mailto:webmaster@kanzaki.com"/>
   <foaf:name>Masahide Kanzaki</foaf:name>
  </foaf:Person>
 </foaf:maker>
</rdf:Description>

基本となる作者情報はfoaf:mboxです。この値さえ記述してあれば、別のFOAFファイルにあるもっと詳細な情報と連動させることが可能です。これらのXHTMLでの記述方法は概ね決まっているので、固定的なテンプレートを用意して対応すれば十分でしょう。

foaf:Person要素を用意して作者情報を収めておくと、あとで述べるような本文から作者に関するメタデータを抽出する時にも、そのデータを記述する場所に困ることがありません。

Body: 本文の語句をメタデータとしてマーク付けする

With some methods, metadata can also be embedded in any element in the XHTML body. This allows richer description and easier maintenance.

head要素はもともとメタデータを記述する部分ですから、そこからRDFを生成するのはごく自然です。しかし、本文とは別にメタデータ(meta要素など)を作成したりメンテナンスするのは、なかなか面倒なもの。そこで、本文に出現する語句をそのままメタデータとしてマーク付けしてしまう方法を検討します。

dfn要素によるキーワード

The simplest way is that uses existing elements to denote 'subject' or topic of the document. For example, it is natural to extract a keyword term from XHML 'dfn' elements. It will be mapped to a URI and disambiguated by finding Wikipedia definitions.

一番シンプルなのは、特定のXHTML要素でマークされた語句をキーワードとして扱う方法です。ここでは、語句の定義を意味するdfn要素からキーワードを取り出し、URIにマッピングすることを考えましょう。

[Ex.9]

<xsl:template match="h:dfn">
  <kw:hasKeyword>
   <kw:Keyword rdf:about="{concat('http://purl.org/net/ns/keyword/',.)}"/>
  </kw:hasKeyword>
</xsl:template>

このテンプレートを、meta要素やlink要素を処理するのと合わせて呼び出せば、例6のrdf:Descriptionに、本文のキーワードがkw:hasKeywordとして列挙されます。文字列としてのキーワードは多義語や同義語のあいまいさがあるので、http://purl.org/net/ns/keyword/にマップし、Wikipediaなどを使って曖昧さ解決を試みます。

Class: 接頭辞つきクラス属性を使う

Prefixed attributes approach can be extended to any elements in the XHTML body. A good candidate is class attribute, which is available for most elements, and is originally designed for classifying elements. The idea of XSLT template is almost the same as that extracts RDF from 'meta' element.

meta要素のname属性値を接頭辞付きとすることでプロパティを明確にしたのと同様な方法を、本文にも導入してみましょう。class属性はどんな要素型にでも使えるので、これを利用すれば、任意の要素をメタデータにすることができます。例えば、本文末尾などに作成日付、更新日付を記述している場合。

[Ex.10]
<address>Original: <em class="dcterms.created">2003-12-15</em>; Last-modified: <em class="dcterms.modified">2004-03-14</em></address>

meta要素の場合とほとんど同様のテンプレートで、これらに対応するdcterms:createddcterms:modifiedといったプロパティ要素を生成できます(名前空間はlink要素でマップしてあるものとします)。

[Ex.11]

<xsl:template match="*[contains(@class,'.')]">
 <xsl:variable name="pfx" select="substring-before(@class,'.')"/>
 <xsl:variable name="ns" select="$schemas[@rel=concat('schema.',$pfx)]/@href"/>
 <xsl:element name="{translate(@class,'.',':')}" namespace="{$ns}">
  <xsl:value-of select="."/>
 </xsl:element>
</xsl:template>

テンプレートのmatch部分で、要素型名自身は「*」となっているので、どんな要素でも接頭辞つきclassを与えればメタデータにできることに注意してください。

a要素のrel属性を利用したメタデータ

The prefixed rel attributes with link elements generate 'resource' object node in RDF. The same method can be applied to 'a' elements in the body. In the following example, the document is assumed to be a translated version of the New York Times article.

link要素のrel属性を使ってリソース型メタデータを記述した方法は、本文ではa要素に応用することができます。たとえば、ある文書が別の文書の翻訳版である場合は次のような情報を記述するでしょう。

[Ex.12]
<p>この文書は<a rel="prism.isTranslationOf" href="http://www.nytimes.com/2003/12/14/arts/...">2003年12月14日付The New York Times</a>の翻訳版です。</p>

ここでは、オリジナルへのリンクに、出版物のメタデータを記述する語彙であるPRISMを使って、prism.isTranslationOfという関係を示しています(接頭辞prismには、link要素で名前空間をマップしてあるものとします)。これまでと同様のテンプレートを使って、次のようなRDFを生成できます。

[Ex.13]

<rdf:Description rdf:about="">
 ...
 <prism:isTranslationOf xmlns:prism="http://prismstandard.org/namespaces/basic/1.0/"
   rdf:resource="http://www.nytimes.com/2003/12/14/arts/..."
   rdfs:label="2003年12月14日付The New York Times"/>
</rdf:Description>

Peson in body: 本文中の作者に関するメタデータ

Many webpages such as weblogs contain information on their authors. Metadata for those information is better to be considered that of the author rather than the document itself. A proposed method here is to assign class="me" to the paragraph that contains personal information. Prefixed attributes within this parafraph will be then treated as child elements of foaf:Person mentioned above.

日記やウェブログといった文書では、作者自身に関するメタデータがよく登場します。たとえば、関心を持った出来事のページなどは、その代表的な例でしょう。これらのデータは、文書自身に関するメタデータとしてではなく、その作者(foaf:Person)のプロパティ要素として扱う必要があります。

ここでは、class="me"と指定した段落(p要素)内に現れる接頭辞つきrel属性やclass属性は、foaf:Person内の要素として取り出すことにします。次のような「関心」を示すパラグラフを考えましょう。

[Ex.14]
<p class="me">I'm interested in <a rel="foaf.interest" href="http://www.w3.org/WAI/">Web Accessibility</a>.</p>

これを処理するテンプレートは、次のような形でfoaf:Person内から呼び出されます。

[Ex.15]

 <xsl:template match="h:html">
  <rdf:RDF>
   <rdf:Description rdf:about="">
    ...
    <foaf:maker>
     <foaf:Person rdf:nodeID="me">
      ...
      <xsl:apply-templates select="h:body//h:p[@class='me']"/>
     </foaf:Person>
    </foaf:maker>
   </rdf:Description>
  </rdf:RDF>
 </xsl:template>

 <xsl:template match="h:p[@class='me']">
  <xsl:apply-templates select=".//h:a[contains(@rel,'.')]"/>
  <xsl:apply-templates select=".//*[contains(@class,'.')]"/>
 </xsl:template>

このXSLTを適用すると、次のようなRDFが生成されます(foaf:の名前空間は省略しています)。

[Ex.16]

<rdf:Description rdf:about="">
 ...
 <foaf:maker>
  <foaf:Person rdf:nodeID="me">
   ...
   <foaf:interest
       rdf:resource="http://www.w3.org/WAI/"
       rdfs:label="Web Accessibility"/>
  </foaf:Person>
 </foaf:maker>
</rdf:Description>

Inverse Functional Propertyとしてのホームページ

We can extract 'resource' uri from 'a' elements with prefixed 'rel' value. Sometimes, these uri denote the resource themselves (e.g. the original page of the translation). However, those often describe the 'homepage' of the resources, working as the Inverse Functional Property. In order to distinguish them, here we use class="ifp" for latter type of 'a' elements. Resulting RDF property will have rdf:parseType="Resource", hence generate blank node and give 'foaf:homepage' to that bnode.

a要素とrel属性を組み合わせてリソース型プロパティを記述する時、href属性は必ずしもそのリソース自身のURIであるとは限りません。たとえば、Relationship vocabularyを用いて <a rel="relship.acquaintanceOf" href="http://www.kanzaki.com/norrington/">Sir Roger Norrington</a> と書いた場合、このURIは Sir Roger Norringtonという人物そのものではなく、彼の「ホームページ」に相当します。つまり、relship.acquaintanceOf要素のrdf:resourceではなく、relship.acquaintanceOfの目的語であるfoaf:Personurlでなければなりません(foaf:Personとfoaf:mboxの関係と同様です)。

話が複雑になってしまいますが、これらを区別するために、ここではこういったa要素には、class="ifp"を設定し、そのURIが目的語リソースのIFPであると示すことにます。

[Ex.17]
<p>I know <a rel="relship.acquaintanceOf" class="ifp" href="http://www.kanzaki.com/norrington/">Sir Roger Norrington</a>.</p>

これを処理するために、条件分岐を加えたテンプレートを用意します。

[Ex.18]

<xsl:template match="h:a[contains(@rel,'.')]">
 <xsl:variable name="pfx" select="substring-before(@rel,'.')"/>
 <xsl:variable name="ns" select="$schemas[@rel=concat('schema.',$pfx)]/@href"/>
 <xsl:element name="{translate(@rel,'.',':')}" namespace="{$ns}">
  <xsl:choose>
   <xsl:when test="@class='ifp'">
    <xsl:attribute name="rdf:parseType">Resource</xsl:attribute>
    <foaf:homepage rdf:resource="{@href}"/>
    <rdfs:label><xsl:value-of select="."/></rdfs:label>
   </xsl:when>
   <xsl:otherwise>
    <xsl:attribute name="rdf:resource"><xsl:value-of select="@href"/></xsl:attribute>
    <xsl:attribute name="rdfs:label"><xsl:value-of select="."/></xsl:attribute>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:element>
</xsl:template>

適用すると、次のように空白ノードを持つRDFが生成されます。

[Ex.19]

<rdf:Description rdf:about="">
 ...
 <foaf:maker>
  <foaf:Person rdf:nodeID="me">
   <foaf:mbox rdf:resource="mailto:webmaster@kanzaki.com"/>
   ...
   <relship:acquaintanceOf
        xmlns:relship="http://purl.org/vocab/relationship/"
        rdf:parseType="Resource">
    <foaf:homepage rdf:resource="http://www.kanzaki.com/norrington/"/>
    <rdfs:label>Sir Roger Norrington</rdfs:label>
   </relship:acquaintanceOf>
  </foaf:Person>
 </foaf:maker>
</rdf:Description>

一般化するためにa要素の内容をrdfs:labelにしていますが、Relationshipのような人間関係を前提とするなら、foaf:nameとしても良いでしょう。

General topic: その他のトピックに関するメタデータ

Many paragraphs in a XHTML body mention topics other than the author or the document itself. To provide appropriate semantics to those metadata, here we assign prefixed class to the 'p' element (Camel name class value works as well). In this case, the class means 'type' of the mentioned resource, e.g. wordnet class. This is treated as 'foaf:topic' of the document, and any prefixed attributes within that paragraph become properties of the resource in turn.

本文で記述している内容に踏み込んでメタデータを加える場合、多くのデータは文書自身や作者についてではなく、記述しているトピックに関するメタデータになります。たとえば、書評や演奏会評を書いているページで、ISBNあるいは演奏会日時をマーク付けするなどです。

ここでは、これらのトピックがひとつの段落にまとめられていると仮定して、その段落がリソースノードを示すものとして扱い、段落内のメタデータはこのリソースのプロパティとして扱ってみることにします。そのため、p要素に与えるclass属性を特殊な方法で扱います。次の例を見てみましょう。

[Ex.20]
<p class="book.Book">I read a book titled <span class="dc.title">Universal HTML/XHTML</span>, published in <span class="dc.date">2000</span>, whose ISBN is <span class="book.isbn">4-8399-0454-5</span>.</p>

p要素のclass属性は、そのリソースのタイプ(rdf:type)を示していると考えられるので、このクラス名を型付きノードの要素名とし、このノードを文書のfoaf:topicとして扱います。XSLTテンプレートは次のようなものが使えます。

[Ex.21]

<xsl:template match="h:p[contains(@class,'.')]">
 <foaf:topic>
  <xsl:variable name="pfx" select="substring-before(@class,'.')"/>
  <xsl:variable name="ns" select="$schemas[@rel=concat('schema.',$pfx)]/@href"/>
  <xsl:element name="{translate(@class,'.',':')}" namespace="{$ns}">
   <xsl:apply-templates select=".//*[contains(@class,'.') or contains(@rel,'.')]"/>
  </xsl:element>
 </foaf:topic>
</xsl:template>

次のRDFが文書自身を示すrdf:Description内に生成されます(foaf:、dc:の名前空間は省略しています)

[Ex.22]

<foaf:topic>
 <book:Book xmlns:book="http://purl.org/net/schemas/book/">
  <dc:title>Universal HTML/XHTML</dc:title>
  <dc:date>2000</dc:date>
  <book:isbn>4-8399-0454-5</book:isbn>
 </book:Book>
</foaf:topic>

ブロックレベル要素のクラス名をclass="Book"のように大文字で始めると、WordNetのクラスとみなし、同じように処理されます。

Predefined names: 接頭辞不要の定義済み名前

Some frequently used names are pre-defined to be directly used in class or rel attribute without any additional preparation.

よく使われる名前は、特別な手続きなしでclass、relなどの属性値として利用できるように、あらかじめマッピングを定義しています。

meta要素

@nameRDF property
descriptiondc:description
keywordskw:hasKeyword、ただしカンマで区切られた語句はそれぞれ別のトリプルとして処理 (comma separated values are transfered to independent triples)
author文書の作者エンティティを作成してそのfoaf:nameとして (foaf:name of an entity that represents the author of the documet)

link要素

次の@relを持つとき、@hrefの値を目的語リソースにして文書のプロパティを生成

@relRDF property
copyright, rightsdc:rights(a要素でも利用可)
alternate@hreflangがあればdcterms:hasVersion、@typeが'+xml'を含むならrdfs:seeAlso
section, subsectiondcterms:isPartOf, dcterms:hasPart(a要素でも利用可)
metardfs:seeAlso、ただしFOAFの場合は文書作者のリソースを主語にする
@rev='made'文書作者のfoaf:mbox

@class属性値

@classRDF property
author, coverage, date, description, format, identifier, rights, title要素内容をリテラル目的語としたdc:プロパティ(authorはdc:creatorに。coverage, description, rightsは@relでも利用可)(dc:* properties with literal object)
creator, contributor, publisherdc:creatorなどとして、目的語にエンティティを生成(@relでも利用可)(dc:* properties with blank node object whose foaf:name is the content of the element)
subjectkw:hasKeyword(@relではdc:subject)
created, modified, abstractdcterms:のプロパティ
mefoaf:makerの目的語として作者自身のノードを生成 (creates a node represents the author)
refs, pubsリスト要素(ul, ol, dl)に与えて参照文献、発表文献リストを生成。リスト項目内にcite要素があればdc:titleにする
ifp@relを持つa要素で用いて、URIをIFPとして扱う(後述)

@rel属性値

@relRDF propertyURIの意味
licensecc:licenseCreative CommonsのライセンスURI
topicfoaf:topic文書のトピック (the topic of the document)
tagkw:hasKeyworddc:relation+キーワードURI
source, relation, subject, creator, contributor, publisher, coverage, descriptiondc:*source, relation以外は@classでも利用可
references, hasPart, isPartOfdcterms:*他も接頭辞付で記述可

microformats

If a block element has a class attribute values eiher of vcard, vevent, hreview, then the content will be treated as microformat, and will generate appropriate RDF graph.

ブロックレベル要素にvcard, vevent, hreviewのいずれかの@classがあれば、その内部をそれぞれのmicroformatで定める名前によって処理。通常のmetaprofのルールは適用せず、名前は全てそのmicroformatに従うものとし、孫要素もプロパティとして処理する。

@classmicroformatsRDFメタデータ
vcardhCardFOAF
hreviewhReviewReview Vocabulary
veventhCalendarRDFCalendar

Additional approach: メタデータを利用する方法

GRDDLによるXSLTの指定

In order to specify the location of XSLT, we can use GRDDL approach. This page itself is an example of GRDDL processing.

せっかくXHTMLにメタデータを加え、それを抽出するためのXSLTも設計するのですから、このXSLTの存在をアプリケーション一般に伝えて、RDFを生成してもらいたいもの。現在検討されている Gleaning Resource Descriptions from Dialects of Languages [GRDDL] は、適用するXSLTを示す汎用的な方法です。

抽出XSLTにhttp://www.kanzaki.com/parts/xh2rdf.xslを使うとすると、GRDDLを記述するhead要素部分は以下のようになります。

[Ex.23]

<head profile="http://www.w3.org/2003/g/data-view">
 <title>....</title>
 <link rel="transformation" href="http://www.kanzaki.com/parts/xh2rdf.xsl" />
 ...

必要なのは、head要素にGRDDLを示すprofileを記述するのと、link要素でrel="transformation"としてXSLTのURIを与えることだけ。独自のXSLTを作ったら、このlink要素のhref属性をそれに合わせて書き換えます。このページ自身がGRDDLによるメタデータ抽出の例となっています。

Alternatively, you can use a profile which in turn specifies the location of XSLT, so that GRDDL works without 'transformation' link. 'http://purl.org/net/ns/metaprof' is an example of such profile.

なお、head要素のprofile属性で示した「プロファイル」でRDDLを使ってXSLTを指定しておくと、GRDDLはそのスタイルシートを使ってRDFを抽出します(つまり、link要素によるtransfer指定が不要になる)。たとえば、この文書で示したメタデータを記述するためのプロファイルは、http://purl.org/net/ns/metaprofで定義しているので、次のようにできます。

[Ex.23-2]

<head profile="http://purl.org/net/ns/metaprof">
 <title>....</title>
 ...

profile属性を用いたGRDDLの利用については、「profile属性でのGRDDL指定」を参照してください。

CSSを使って本文中のメタデータを顕在化させる

By using CSS, metadata in the body will become available to human readers as well as agents.

メタデータはマシンだけのためのものではありません。接頭辞付き属性でマーク付けした箇所をCSSを使ってハイライトすれば、人間の読者にとっても有益な情報を提供できます。たとえば、class="dc.title"とクラス指定した部分に背景色を与えるとすれば、次のようなCSS宣言を用います。

[Ex.24] .dc\.title {background: #ffd}

ピリオド「.」はCSSのセレクタで直接使うことができないので、「\」を使ってエスケープします。rel属性の場合は、CSS2の属性値セレクタを利用します。

[Ex.25] a[rel~="relship\.acquaintanceOf"] {background: #cfc}

残念ながらこの属性値セレクタは認識できないブラウザが多いので、今すぐの効果はあまり大きくありませんが、可能性はとても面白いものを持っています。

Simpler approach: より簡単な方法

Mapping prefixes to schema uris via link elements would be a little bit cumbersome if only limited set of vocabularies is used across the entire site. By defining those mapping in the XSLT, it's possible to skip link declarations in each XHTML file, and template will be simpler. This sacrifices the generality of XSLT, but will make things easier in some cases.

link要素で名前空間と接頭辞を結びつけるのは、アプリケーションに予備知識が無くてもさまざまな語彙を追加できるというメリットがありますが、XSLTが若干複雑になり、毎回link要素を加えるという(少しではあるものの)手間がかかります。メタデータをマーク付けは、Dublin Core、FOAFなどある程度限られた語彙でおおむね間に合いますから、これらの名前空間を最初からXSLTで宣言しておき、XHTMLではマッピングを省略するという方法をとれば、仕組みは簡単になります。

例5のmeta要素からRDFを生成するテンプレートは、名前空間が定義済であるとすれば次のように単純化できます。

[Ex.26]

<xsl:template match="h:meta[contains(@name,'.')]">
 <xsl:element name="{translate(@name,'.',':')}">
  <xsl:value-of select="@content"/>
 </xsl:element>
</xsl:template>

ほかのrel属性やclass属性を用いるものも、同様にテンプレートを簡略化できます。XHTMLでのマーク付けは、(link要素による名前空間マッピングは省略できますが)これまで述べたのと同じ方法です。

References

[RFC2731]
J. Kunze, Encoding Dublin Core Metadata in HTML, , The Internet Society
<http://www.ietf.org/rfc/rfc2731.txt>
[GRDDL]
Dominique Haza鼠-Massieux, Dan Connolly, Gleaning Resource Descriptions from Dialects of Languages (GRDDL), , W3C Coordination Group Note
<http://www.w3.org/TR/grddl/>