拡張されたXMLのリンク言語:XLink

XLink (XML Linking Language)は、XML文書の要素にリンクの機能を与えるための規格を定めています。これは、HTMLのようなシンプルなリンクだけでなく、複数のリソースへのリンクや間接リンクなど、さまざまな高度なリンク機能を提供してくれます。XLinkは特別な要素タイプを導入するのではなく、XLinkで定めるグローバル属性を任意の要素に適用し、その要素にリンクの役割を持たせます。

XLinkとは

HTMLのハイパーリンクは、一つの始点アンカーから一つの終点アンカーに向けて、一対一の単一方向リンクを定義します。このリンクは単純で扱いやすいために、誰でも簡単にリソースをリンクすることができ、ウェブの発展に不可欠の役割を果たしました。

しかし、リンクを「リソースとリソースの関連付け」という視点で考えると、HTMLの一対一の単一方向リンクだけでは不十分です。XML文書一般にリンク機能を付加するXLinkでは、HTML型のリンクである「単純リンク」だけでなく、より高機能なリンクを「拡張リンク」として実現します。

XLinkの基本コンセプト

XLinkの仕様書[XLINK]では、XLinkの基本的な機能として次の3つをあげています。

  1. 2つ以上のリソース間のリンク関係を記述する
  2. リンクにメタデータを関連付ける
  3. リンクされるリソースとは別の場所でリンクを記述できるようにする

仕様書の記述に従って、これら3つのコンセプトと関連定義を簡単に説明しましょう。

XLinkにおいて、リンクとはリソース(およびリソースの一部)間の明確な関係を指すと定義されています。このリンク関係を記述するための要素をリンク要素(Linking Element)と呼びます。

ここでいうリソースとは、HTMLのハイパーリンクと同様、ファイル、プログラムなど、URIで指定できるあらゆるものを指します。リンクされているリソースは、“リンクに組み込まれている”(participate)といいます。リンクの中で、特に人間に対して表示することを第一の目的としているものをハイパーリンクと呼ぶと定義されています。

2番目の「リンクにメタデータを関連付ける」とは、リンクの役割や性質、動作などを具体的に示すことを指しています。XLinkでは、これらを記述するために特別な用語を定義しています。

トラバーサル
リンクを利用したり辿ったりすることをトラバーサル(traversal)と呼びます。リンクにはいくつものリソースを関連付けることができますが、トラバーサルというときは常に一対のリソース間での働きを指します。トラバーサルの出発点を始点リソース、到達点を終点リソースといいます。
アーク
トラバーサルの方向や、その時のアプリケーションの挙動などに関する情報をアークと呼びます。同じペアのリソースに対して2つのアークが設定され、始点と終点が入れ替わっていれば、そのリンクは双方向であるということになります。これは単にリンクをたどって戻ってくるというものとは違う意味合いを持ちます。

最後の「リンクされるリソースとは別の場所でリンクを記述できるようにする」とは、HTML型の単純リンクでは実現できない、拡張リンクの特徴の一つです。この考え方を示すためにXLinkでは、リンクに組み込まれているリソース(部分リソースを含む)が、上記の「リンク要素」の内部(あるいはそれ自身)である場合、それをローカルリソースと呼び、リンク要素の外部にあってURIで参照されるものをリモートリソースと呼びます。対象となるリソースがリンク要素と同じ文書内にあっても、あるいはリンク要素内にあったとしても、URIで参照されるものはリモートリソースとして扱われます。

アークのうち、始点がローカルで終点がリモートであるものを外向き(outbound)、始点がリモートで終点がローカルであるものを内向き(inbound)、いずれもリモートであるものを第三者(third party)と呼びます。

HTMLのリンクは外向きリンクの代表例です。始点リソースに直接リンクのアンカーを設定できない(リソースの書き換え権限がないなど)ときでも、内向きリンクや第三者リンクを用いることで、リンク関係を設定することが可能になります。

図:リンク要素内にはローカルリソース、外部にはリモートリソースがある。それらの関係はアークで示される。

XLink名前空間とグローバル属性

XLinkは特定の要素タイプを定義せず、どんな文書型の要素タイプでも利用できるグローバル属性を定め、それを利用することで任意の要素にリンク機能を持たせることができるようにしています。XLinkの名前空間

http://www.w3.org/1999/xlink

というURIで定義されます。この文書では、以下特に指定しない限り、xlink:という接頭辞が(xmlns:属性により)このURIにマッピングされているものとして、名前空間宣言を省略して記述します。またXLinkでは、この属性を用いれば任意の要素をリンク要素とできるので、以下の例で記述している要素名に特別な意味はなく、別のものと置き換えてもリンク機能に違いはありません。

この名前空間では10のグローバル属性が定義されています。ある要素をXLinkとして働かせるには、まずtype属性でどんな種類のリンク機能を持たせるかを指定します。このtype属性の値は6種類あり、その値に対応して「○○型要素」という呼び方をします。ほかのグローバル属性の使い方は、このtype要素の型ごとにパターンが定まっています。

XLink要素のタイプごとの属性パターン
属性各タイプの属性パターン
typesimpleextendedlocatorarcresourcetitle
hrefO -R---
roleOOO-O-
arcroleO--O--
titleOOOOO-
showO--O--
actuateO--O--
label--O-O-
from---O--
to---O--

type属性の値は常に必要で、残る9種類の属性はタイプによって必須(R)、オプション(O)、使用しない(-)が決まります。たとえばtype属性がlocatorなら、その要素は「locator型要素」となり、href属性が必須、role, title, label属性がオプションとなります。

なお、これらのXLinkの属性はグローバル属性であるため、常に名前空間接頭辞で修飾して用います。XLink名前空間をxlink:で表すなら、xlink:type="simple"などとするわけです。HTMLやXHTML1.0のa要素には同じローカル名を持つhref属性が用いられていますが、これらは個々のa要素に属するローカル属性で、XLinkのリンク先URIを指定することはできません。

拡張リンク

拡張リンク(Extended Link)は、内向きリンク、第三者リンク、任意の数のリソースを組み込んだリンクなど、XLinkのすべての機能を提供します。拡張リンクは、xlink:type="extended"と指定したリンク要素内に、リンク元、リンク先となるリソースを指定するlocator型要素resource型要素と、その役割を示すarc型要素を記述して実現します。また、title型要素を含めることで、人間の利用者に分かりやすい説明を提供することができます。

簡単な外向きリンクの例を見てみましょう。

[例1]

<mylink xlink:type="extended">
 <start xlink:type="resource" xlink:label="wref">The Web KANZAKIへのリンク</start>
 <dest xlink:type="locator" xlink:href="http://kanzaki.com" xlink:label="web"/>
 <go xlink:type="arc" xlink:from="wref" xlink:to="web"/>
</mylink>

この例では、webというラベルを持つリモートリソースをlocator型要素(dest)で、wrefというラベルを持つローカルリソースをresource型要素(start)で示し、両者の間の関係(外向きアーク)をarc型要素(go)で示しています。

[resource型要素:wref]-->[リモートリソース:web]

以下のセクションで、それぞれのタイプのリンク要素について説明していきます。

〔補足〕extended型要素の子要素や孫要素として別のXLinkを記述することも可能です。この場合は、内部のXLinkと親のXLink要素は直接のリンク関係は持ちません。また、どんな挙動をするかも仕様では定められていません。

リソースをリンクに組み込む要素

リンクとはリソース間の関係を示すものですから、対象となるリソースを指定しなければなりません。ローカルリソースを組み込むにはresource型要素、リモートリソースを組み込むにはlocator型要素を用います。いずれもextended型要素の直接の子要素として記述します。複数あってもかまいません。

resource型要素は例のように要素の内容としてマークアップする部分がローカルリソースとなります。locator型要素では、xlink:href属性を用いてリモートリソースのURIを指定します。

いずれの要素も、次に述べるアークによってその関係を定義できるよう、xlink:label属性で識別名(ラベル)をつけておきます。識別名はXMLの名前付けルールに従うほか、コロンを用いることもできません。アークで参照するラベルは、同じリンク要素内にあるものに限られます。言い換えれば、xlink:label属性のスコープは同じリンク要素内ということになります。

[例2]

 <start xlink:type="resource" xlink:label="wref">The Web KANZAKIへのリンク</start>
 <dest xlink:type="locator" xlink:href="http://kanzaki.com" xlink:label="web"/>

リンクの役割を定義するアーク要素

リソース間のトラバーサルやそのときのアプリケーションの挙動を示す「アーク」は、arc型要素で定義します。トラバーサルの方向は、xlink:from属性xlink:to属性で始点と終点のリソースの「ラベル」を指定して表現します。arc型要素はextended型要素の直接の子要素でなければなりません。またxlink:fromxlink:to属性で指定するラベルは、対応するxlink:label属性をもつ要素が同じリンク要素内に存在する必要があります。

例では、xlink:fromローカルリソースxlink:toリモートリソースが割り当てられているので、外向きアーク(リンク)ということになります。ここでgo要素のxlink:fromxlink:toを入れ替えると内向きリンクが、またstart要素をresource型ではなくlocator型とすることで、第三者リンクが実現します。

拡張リンクでは、一対一のリンクだけでなく、一対多、多対多のリンクも表現できます。

[例3]

<mylink xlink:type="extended">
 <start xlink:type="resource" xlink:label="wref">関連サイト</start>
 <dest xlink:type="locator" xlink:href="http://kanzaki.com" xlink:label="web"/>
 <dest xlink:type="locator" xlink:href="http://www.w3.org" xlink:label="web"/>
 <go xlink:type="arc" xlink:from="wref" xlink:to="web"/>
</mylink>

xlink:label属性によるラベル付けに際しては、異なる要素に同じ名前を与えてもかまいません。これを利用すると、1つのarc型要素による指定だけで、2組以上のリソース間のアークを表現することができます。上記の例では、http://kanzaki.com、http://www.w3.orgを示すdest要素がともにwebというラベルを持つため、xlink:to="web"によって2つのアークができています。

図:1つのアーク型要素により、ローカルリソースから2つのリモートリソースへのアークが形成されている。

リンク要素内に複数のarc型要素を記述することもできます。上記のラベルの適用方法と組み合わせると、複雑なリンク関係をまとめて定義することが可能です。

[例4]

<mylink xlink:type="extended">
 <start xlink:type="resource" xlink:label="wref">関連サイト</start>
 <dest xlink:type="locator" xlink:href="http://kanzaki.com" xlink:label="web"/>
 <dest xlink:type="locator" xlink:href="http://www.w3.org" xlink:label="web"/>
 <start xlink:type="resource" xlink:label="sref">仕様書</start>
 <dest xlink:type="locator" xlink:href="http://www.w3.org/TR/xlink" xlink:label="spec"/>
 <go xlink:type="arc" xlink:from="wref" xlink:to="web"/>
 <go xlink:type="arc" xlink:from="sref" xlink:to="spec"/>
</mylink>

図:リンク要素内にはいろいろな関連するリソースとアーク型要素を記述できる。その結果、多対多の拡張リンクが形成される。

同じリンク要素の中で、xlink:fromとxlink:to属性の値ともに同じ複数のarc型要素を記述することはできません。どちらか一方の属性値が共通であるarc型要素は問題なく記述できます。

HTMLでのリンクには、要素タイプや属性によって次のような挙動があります。

  • a要素:ユーザーのリクエスト(マウスクリックなど)に応じてリンク先のリソースを読み込んでページ全体に表示
  • a要素でのtarget属性指定:新たなウインドウを開いてリソースを表示
  • img要素など:ページをロードするときにリンク先リソースでその部分を置換

XLinkではこれらの挙動を、arc型要素のxlink:show属性xlink:actuate属性で指定します。

xlink:show
HTMLでのa要素、target属性付a要素、img要素の表示方法は、それぞれxlink:show属性のreplacenewembedという値に対応します。仕様書に定義されていないアプリケーション独自の振舞いをさせたい場合には、他のマークアップで動作を指定しているならother、そうでなければnoneという値を用います。
xlink:actuate
トラバーサルのタイミングを指定します。HTMLのa要素、img要素の実施タイミングはそれぞれonRequestonLoadという値に対応します。独自の振舞いについては、xlink:showと同様にotherもしくはnoneを用います。

例3のリンクを、ユーザーのマウスクリックなどで実行し、ページ全体を入れ替えるものとして定義するならば、次のようになります。

[例5]

<go xlink:type="arc" xlink:from="wref" xlink:to="web"
    xlink:show="replace" xlink:actuate="onRequest"/>

HTMLのimg要素のような画像の埋め込みを拡張リンクで表現すると、次のようになります。

[例6]

<image xlink:type="extended">
 <pict xlink:type="locator" xlink:href="./smily.png" xlink:label="smile"/>
 <disp xlink:type="resource" xlink:label="here">:-)</disp>
 <go xlink:type="arc" xlink:from="here" xlink:to="smile"
     xlink:show="embed" xlink:actuate="onLoad"/>
</image>

これらの属性は、文書で毎回指定するのはわずらわしいので、DTDなどでデフォルト属性として定義しておくのが一般的な使い方になるでしょう。

リンク要素の「意味」を示す属性

リンクの意味を示すセマンティック属性は、xlink:role, xlink:arcrole, xlink:titleの3種類があります。xlink:role, xlink:arcrole属性は絶対URIでコンピュータ処理のための情報を、xlink:titleはそれらと同等の説明を人間が利用するために文字列として記述します。

xlink:role
リンクやリソースのプロパティ(定義など)のURIを示します。
xlink:arcrole
arc型要素の場合は、xlink:roleではなく特にxlink:arcrole属性を用いてその意味を表現します。この属性は、始点リソースに対するの終点リソースの相対的な意味を示すものです。前者を主語、後者を述語と捉えた場合、RDFのプロパティに相当する役割を果たします。
xlink:title
xlink:role, xlink:arcrole属性で示される意味を、人間に読める形の文字列として記述します。HTMLのtitle属性と同等と考えることができます。

意味(プロパティ)をURIで示すというのは分かりにくいかもしれませんが、名前空間の場合と同様に、同じ用語が異なる意味で使われることを避け、曖昧さなく機械処理できるようにしたり、そのURIをたどることで意味の定義をコンピュータが理解できるようにするという目的があります。XLinkは人間の利用を主目的とした「ハイパーリンク」だけでなく、コンピュータ処理のためのリンクも念頭においているということを思い出してください。

[例7]

<mylink xlink:type="extended" xlink:title="文献リスト">
 <dest xlink:type="locator" xlink:href="http://www.w3.org/TR/xlink"
     xlink:label="spec" xlink:title="W3CのXLink仕様書の最新バージョン"/>
 <start xlink:type="resource" xlink:label="sref">XLink仕様書</start>
 <go xlink:type="arc" xlink:from="sref" xlink:to="spec"
     xlink:arcrole="http://purl.org/dc/terms/references"
     xlink:title="参照文献"/>
</mylink>

この例では、「XLink仕様書」という文字列を持つローカルリソースからW3Cのサイトにある仕様書へのアークの意味を、Dublin Coreの修飾子要素であるreferenceというプロパティへのURIで示しています。これによって、このアークは「参照文献」という意味を持つということを、コンピュータも曖昧さなく理解できるというわけです。

タイトル型要素

XLinkの要素はxlink:title属性を持つことができますが、extended, locator, arcの各タイプの要素はそれ以外に内容としてtitle型要素を任意の数もつことができます。これは、属性としては表現しきれないようなタイトル、たとえばルビを加えたり、異なる言語のタイトルを提供したりという場合が想定されています。

[例8]

 <dest xlink:type="locator" xlink:href="http://kanzaki.com" xlink:label="web">
  <desc xlink:type="title" xml:lang="en">KANZAKI,Masahide</desc>
  <desc xlink:type="title" xml:lang="ja">
   <ruby xmlns="http://www.w3.org/1999/xhtml">
    <rb>神崎正英</rb><rt>かんざきまさひで</rt>
   </ruby>
  </desc>
 </dest>

リンクベース

内向きアークや第三者アークは、リンク要素とは異なるところにリンクの始点があるため、実際にアプリケーションがリンクを認識して利用できるようにするためには少々工夫が必要になります。

あるレポート(s1024.xml)に登場するトピックについて、関連するリソースがいくつかあるとしましょう。そのレポートは別の人の著作物なので、直接リンク要素などを書き加えることができません。そのため、XLinkの第三者アークを利用して、レポート中のトピックと参考リソースを結びつけるリンクを、いずれのリソースとも異なる場所にまとめて記述します。

[例9]

<link xlink:type="extended" id="reports-ref"
     xlink:title="レポートからの参照リンクデータベース">
 <paper xlink:type="locator"
     xlink:href="http://kanzaki.com/papers/s1024.xml#brahms"
     xlink:label="sec-brahms" xlink:title="レポートのブラームスの章"/>
 <paper xlink:type="locator"
     xlink:href="http://kanzaki.com/papers/s1024.xml#bach" 
     xlink:label="sec-bach" xlink:title="レポートのバッハの章"/>
 <ref xlink:type="locator"
     xlink:href="http://www.mjq.net/brahms/"
     xlink:label="ref-brahms" xlink:title="Johannes Brahms WebSource"/>
 <ref xlink:type="locator"
     xlink:href="http://www.jsbach.org/"
     xlink:label="ref-bach" xlink:title="The JS Bach Home Page"/>
 <ref xlink:type="locator"
     xlink:href="http://www.music.qub.ac.uk/~tomita/bachbib/"
     xlink:label="ref-bach" xlink:title="Bach Bibliography"/>
 <go xlink:type="arc" xlink:from="sec-brahms" xlink:to="ref-brahms"/>
 <go xlink:type="arc" xlink:from="sec-bach" xlink:to="ref-bach"/>
</link>

このようにリンクを外部で管理することで、任意のリソース間のリンクを自在に設定できる上に、リンク先のチェックなどのメンテナンスが効率的に行えるというメリットもあります。このような(外向きアークではない)リンク関係の集まりを持つ文書を、リンクのデータベース=リンクベース(linkbase)と呼びます。

図:始点、終点ともにリモートリソースの場合、別の文書にリンクの関係を記述しておく。

この場合、リンクの始点リソースになっているs1024.xmlを開いても、ここから関連リソースにリンクがあるということは分かりません。アプリケーションは、リンクベースを見てはじめて、s1024.xmlからリンクされているリソースを理解できます。

リンクベースとarcrole

アプリケーションにリンクベースがあることを伝えるために、XLinkには特別なarcroleプロパティが用意されています。

http://www.w3.org/1999/xlink/properties/linkbase

このURIをarcroleの属性値として持つアーク型要素は、終点リソースがリンクベースであることを意味します。アプリケーションは、このアーク型要素を処理するときには、リンクベースを読み込んでそこに記述されたリンクを解釈し、「始点リソースがロードされたとき」のために準備をします。たとえば、例9のリンクベースを解析しておくことで、s1024.xmlを開いたときに、"#brahms"や"#bach"で示されるフラグメントにリンクを示すボタンなどを表示することができ、そのボタンをクリックすることで終点リソースにトラバースすることが可能になるわけです。

[例10]

<example xlink:type="extended" id="ex1">
 <report xlink:type="locator"
     xlink:href="http://kanzaki.com/papers/s1024.xml" xlink:label="sample"/>
 <linkbase xlink:type="locator" xlink:href="#reports-ref" xlink:label="lbase"/>
 <lect xlink:type="locator" xlink:href="#ex1" xlink:label="ex1"/>
 <load xlink:type="arc" xlink:from="ex1" xlink:to="sample"
       xlink:show="new" xlink:actuate="onLoad"/>
 <load xlink:type="arc" xlink:from="sample" xlink:to="lbase"
       xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase"
       xlink:actuate="onRequest"/>
 <desc xlink:type="title">学生レポートに関連する文献の例</desc>
</example>

少々複雑ですが、研究発表会のプレゼンテーションを行うXML文書に、事例として学生の論文を示し、さらにそこから関連文献にリンク付けをするというXLinkを記述するケースを考えます。上記のexample要素は、

  1. この文書のロード時に例として示す学生の論文も別ウインドウに表示しておく;
  2. さらにこのexample要素でマウスクリックなどを行うことによって、リンクベース(同じ文書中にある)を用い、学生論文に関連リソースへのリンクを表示させる;

という2つのアーク(load要素で示される)を持っています。

図:最初のアークによって学生の論文がロードされる。2つめのアークがアクティブになると、リンクベースを用いて、論文から関連文献へのリンクが形成される。

直接s1024.xmlを開くだけでは、これらの関連リソースがあることは分かりません。このような別の文書からリンクベースを経由することで、間接的なリンクが実現するという点がXLinkの新しい機能です。

リンクベースとデータベース

リンクベースとはリンク関係についてのデータベースですから、その情報をRDBなどのデータベースシステムで管理することももちろん可能です。XLinkのリンクベースとして機能させるためには、XMLドキュメントであることが必要なので、CGIなどのゲートウェイを通して、指定されたリソースに対応するリンクベースをXMLとしてシリアル化して生成することになります。

[例11]

<link xlink:type="extended">
 <report xlink:type="locator"
       xlink:href="http://kanzaki.com/papers/s1024.xml"
       xlink:label="report"/>
 <linkbase xlink:type="locator"
       xlink:href="http://kanzaki.com/cgi/linkbase?paper=s1024"
       xlink:label="lbase"/>
 <load xlink:type="arc" xlink:from="report" xlink:to="lbase"
       xlink:arcrole="http://www.w3.org/1999/xlink/properties/linkbase"
       xlink:actuate="onRequest"/>
 <desc xlink:type="title">レポートs1024の関連リソース</desc>
</example>

この例では/cgi/linkbaseというゲートウェイを経由して、データベースに収録されたリンク関係を、s1024.xmlという文書に適用しているわけです。このような形をとれば、さまざまなリソースについての注釈をデータベース化し、リクエストに応じて関連するリソースや解説を提供するというサービスなどを、もとのリソースに手を加えることなく実現することができるようになります。メタデータを使ったアノテーション[ANNOTEA]と合わせて、面白い可能性をもった分野になるかもしれません。

単純リンク

単純リンク(simple link)は、1つのローカルリソースと1つのリモートリソースを組み込み、前者から後者への1つのアークのみを持つXLinkの機能限定版です。HTMLのa要素タイプやimg要素タイプに相当するシンプルな関係を示しますが、show、actuateといったリンクの挙動を定義する属性や、role、arcrole、titleといったリンクの意味を示す属性も利用することができます。

HTMLのa要素タイプの働きは、単純リンクでは次のように表現できます。

[例12]

<a xlink:type="simple"
   xlink:href="http://kanzaki.com"
   xlink:show="replace"
   xlink:actuate="onRequest">
The Web KANZAKI
</a>

同様に、HTMLのimg要素タイプは次のようになります。

[例13]

<img xlink:type="simple" xlink:href="./smily.png" 
     xlink:show="embed" xlink:actuate="onLoad">:-)</img>

HTMLの場合に比べて複雑に見えますが、xlink:href以外の属性は基本的に固定できるので、DTDなどでデフォルトを定義して、文書では書かないようにすればシンプルなリンクを実現できます。また、HTMLの場合と違ってリンクのネストが認められていますが、その挙動がどうなるかは仕様では定められていません。

XLinkをXHTMLなどの文書型で利用する場合、次のような問題点があるということが指摘されています。

これを回避するために、HTMLワーキング・グループはXHTML 2.0の草案と合わせてHLinkという独自の企画を発表したりして混乱しており、W3CのTAG(Technical Architecture Group)が調整を行っています[TAG-HLINK](2002年秋)。

参照文献

Steve DeRose, et al., XML Linking Language (XLink) Version 1.0, , W3C Recommendation
<http://www.w3.org/TR/xlink/>
[ANNOTEA]
W3C Semantic Web Activity, Annotea Project
<http://www.w3.org/2001/Annotea/>
Stuart Williams, Summary of Technical Discussion of TAG Issue xlinkScope-23, , Revision 1.10
<http://www.w3.org/2001/tag/2002/1028-XLink-HLink>