XMLポインタ言語 (XPointer)


W3CWD-xptr-19980303


XMLポインタ言語 (XPointer)

W3Cワーキングドラフト 1998年3月3日

このバージョン(原文):
http://www.w3.org/TR/1998/WD-xptr-19980303
以前のバージョン:
http://www.w3.org/TR/WD-xml-link-970731
最新のバージョン:
http://www.w3.org/TR/WD-xptr
編集者:
Eve Maler (ArborText) <elm@arbortext.com>
Steve DeRose (Inso Corp. and Brown University) <sderose@eps.inso.com>

この文書の位置づけ

これは、W3C会員およびその他の利害関係者による検討のためのW3Cワーキングドラフトである。この文書はドラフト文書であって、何時にても他の文書によって更新・置換・廃止される場合がある。W3Cワーキングドラフトを参照資料として用いたり「進行中の作業」以外のものとして引用することは不適切である。現行のW3Cドラフトの一覧は http://www.w3.org/TR で見ることができる。

これはW3C XMLアクティビティ(現状については http://www.w3.org/MarkUp/XML/Activity を見ること)の一部である。XPointer を使うことが予定されている XLink 言語についての情報は http://www.w3.org/TR/WD-xlink を見ること。

XPointer の情報を提供する設計理念についての追加的な背景事情はhttp://www.w3.org/TR/NOTE-xlink-principlesを見ること。

概要

この文書は、XML文書の内部構造へのアドレッシングをサポートする構成概念を仕様化する。特に、明示的なID属性を生み出すか否かを問わず、要素、キャラクタ文字列やXML文書のその他の部分への具体的な参照を提供する。

XMLポインタ言語 (XPointer)

バージョン 1.0

目次

1. 序論
    1.1 言語の設計目標
    1.2 既存規格との関係
    1.3 用語集
    1.4 表記法
2. ロケータ内部の XPointer
3. XPointer 言語
    3.1 XPointer 構造
    3.2 絶対的ロケーションターム
        3.2.1 root キーワード
        3.2.2 origin キーワード
        3.2.3 id キーワード
        3.2.4 html キーワード
    3.3 相対的ロケーションターム
        3.3.1 相対的ロケーションターム引数
        3.3.2 インスタンス数による選択
        3.3.3 ノード型による選択
        3.3.4 属性による選択
        3.3.5 descendant キーワード
        3.3.6 ancestor キーワード
        3.3.7 preceding キーワード
        3.3.8 following キーワード
        3.3.9 psibling キーワード
        3.3.10 fsibling キーワード
    3.4 スパニングロケーションターム
    3.5 属性ロケーションターム
    3.6 文字列ロケーションターム
    3.7 単なるノードではないロケーション
        3.7.1 スパニング文字列
        3.7.2 all キーワード
        3.7.3 スパニング XPointer
    3.8 リンク永続性
4. 適合性

付録

A. 未了の作業
    A.1 属性値の大文字小文字の区別
    A.2 XPointer と抽象的データ型
B. XPointer と TEI 拡張ポインタ
C. 参照資料

1. 序論

この文書は、XML文書の内部構造へのアドレッシングをサポートする言語を仕様化する。特に、明示的なID属性を生み出すか否かを問わず、要素、キャラクタ文字列やXML文書のその他の部分への具体的な参照を提供する。

1.1 言語の設計目標

以下は XPointerを支配する設計理念のまとめである。

  1. XPointer はXML文書にアドレスするものでなくてはならない。
  2. XPointer はインターネット上でそのまま利用可能でなければならない。
  3. XPointer はURIでそのまま利用可能でなければならない。
  4. XPointer 設計は迅速に用意されなければならない。
  5. XPointer 設計は形式的かつ簡潔でなければならない。
  6. XPointer 文法は相当程度コンパクトであり人間が読めるものでなければならない。
  7. XPointers は可用性のために最適化されなければならない。
  8. XPointers は実装できるものでなければならない。

1.2 既存規格との関係

3つの規格が特に影響力を有している。

その他数多くのリンクシステム、特に Dexter, FRESS, MicroCosm, InterMedia も、この設計に対して情報を与えている。

1.3 用語集

この文書においては以下の基本的用語が適用される。

要素樹 (element tree)
XML文書の中のタグ、属性その他のマークアップ構造によって指定される関連する構造を抽象的に表現するもの。
リンク (link)
2つ以上のデータオブジェクトやデータオブジェクトの一部分の間の明示的な関係。
結合要素 (linking element)
リンクの存在を主張し、その特性を記述する要素。
ロケータ (locator)
リソースを識別するデータであり、リンクの一部分として与えられる。
リソース (resource)
抽象的意味では、リンクに参加している情報またはサービスのアドレス可能な単位。例としては、ファイル、画像、文書、プログラム、クエリー結果がある。具体的には、ある結合要素の中のロケータの仕様により到達可能なもの。この用語およびその定義はWWWを支配している基本的な仕様書から取られることに注意すること。
サブリソース (sub-resource)
リンクの正確な目的地として指し示されるリソースの一部分。一例を挙げると、リンクは、文書全体が引き出されて表示されるけれどもそのある特定の部分はリンクされた特定のデータであって、ハイライト化やスクロールなどによる指示といったようなアプリケーションに適した方法で扱われるべきことを指定する場合もあるだろう。

1.4 表記法

ロケータの形式的な文法は、XML仕様書で説明されている単純なEBNF(Extended Backus-Naur Form)ロケーションを使って与えられる。

2. ロケータ内の XPointer

リソースのためのロケータは、概して、URI (Uniform Resource Identifier) によって与えられる。XPointer は、より正確なサブリソースを指定するために、URI構造と結びついたフラグメント識別子として使うことができる。XMLリソースを指し示すフラグメント識別子はどれも XPointer でなければならない。しかしながら、XML文書でないリソース(たとえばHTML文書やPDF文書)を識別するXMLリソース内のロケータについては、XPointer はロケータの文法や意味を制約しない。

3. XPointer 言語

XPointer は、XML文書の要素やその他のマークアップ構造によって定義されたの上で作用する。

XPointer は、一連のロケーションタームからなり、そのそれぞれが、大抵は先のロケーションタームによって指定されたロケーションとの相対関係で、ロケーションを指定する。それぞれのロケーションタームは(id, child, ancestor などといった)キーワードをもっており、インスタンス数や要素型、属性といったような引数をとることができる。たとえば、child(2,CHAP) というロケーションタームは、CHAP という型である2つ目の子要素を参照する。

3.1 XPointer 構造

XPointer の中心部分は、アドレッシング情報の基本単位であるロケーションタームである。XPointer の中でのロケーションタームの組み合わせは、正確な位置を指定するという効果をもつ。

XPointer
[1]  XPointer ::= AbsTerm '.' OtherTerms
AbsTerm
OtherTerms
[2]  OtherTerms ::= OtherTerm
OtherTerm '.' OtherTerm
[3]  OtherTerm ::= RelTerm
SpanTerm
AttrTerm
StringTerm

多数の XPointer が、要素樹の中の個別のノードを位置づけている。しかしながら、ロケーションタームの中には、より複雑なデータセットを位置づけるものもある。たとえば、文字列マッチはノードの一部分だけを位置づける場合があるし、span ロケーションタームを含んでいる XPointer (スパニング XPointer と呼ばれる)は、要素全体を構成しないサブリソースを参照することができる。

リソースへのトラバーサルの実装はこの仕様書によって制約されないことに注意すること。特に、スパンによって指し示されているリソースを扱うことは、多分高度にアプリケーション依存である。ディスプレイ指向アプリケーションプログラムでは、そうしたトラバーサルは単に指し示されたキャラクタをハイライト化するだけということになろう。しかし、構造指向ビューアは、完全なノードやサブツリーでないサブリソースには興味がないかもしれない。スパンは部分的要素を位置づける場合があるため、要素のセットやリストとして扱えないことに注意すること。

ロケーションタームは、絶対的ターム、相対的ターム、スパンターム、属性ターム、文字列データタームに分類される。絶対的タームは、他のどのサブツリーロケーションへの参照もなしにXML文書内の1つ以上の要素またはロケーションを選択する。相対的タームや文字列データタームは、ロケーションソースと呼ばれる他のロケーションのタームの中でロケーションを指定する。先行するロケーションタームがないならば、ロケーションソースは完全なリソースである。そうでなければ、先行するタームによって指定されるロケーションである(これはその前のロケーションタームとの相対指定である場合もある)。

3.2 絶対的ロケーションターム

このセクションにおいて開設されるキーワードは、ロケーションソースの存在に依存しない。これはロケーションタームを設立するために使うことができ、また自己包含的 XPointer としても機能することもできる。

絶対的ロケーションターム
[4]  AbsTerm ::= 'root()' | 'origin()' | IdLocHTMLAddr
[5]  IdLoc ::= 'id(' Name ')'
[6]  HTMLAddr ::= 'html(' SkipLit ')'

rootorigin の後の空括弧は、他のキーワードとの一貫性を図り、また単なる "root" や "origin" という文字列を含む XPointer の曖昧な解釈を避けるためのものである。

3.2.1 root キーワード

XPointer が root() で始まるならば、ロケーションソースは包含リソースのルート要素である。XPointer が先頭の絶対的ロケーションタームを省略すれば(すなわち OtherTerms だけで構成されていれば)、先頭に root() 絶対的ロケーションタームをもつものとみなされる。

3.2.2 origin キーワード

origin キーワードは、XPointer がアプリケーションソフトウェアによって、XLink 仕様書で定義されているようにトラバーサルのリクエストに対する応答の中に生成される場合にのみ、後続のロケーションタームのための意味のあるロケーションソースを生み出す。XPointer が origin() で始まるならば、ロケーションソースは、デフォルトのルート要素ではなく、ユーザがトラバーサルを開始した元のサブリソースである。これは XPointer が「次の章」といったような抽象的なな項目を選択できるようにする。

URIも提供され、それがトラバーサルが始められた元のリソースと異なる包含リソースを識別するロケータの中で origin() を使うことはエラーである。

3.2.3 id キーワード

XPointer が id(NAME) で始まるならば、ロケーションソースは、宣言された ID 型をもつ属性と、与えられた Name にマッチする値とを有する包含リソースの中の要素である。

たとえば、id(a27) というロケーションタームは、a27 という値の ID 型として宣言された属性を有する包含リソースの、必然的に一意的な要素を選ぶ。

XML文書が、値が一意的なIDとして働くことを意図されているすべての属性を宣言していなければ、アプリケーションは、ID属性を同じ文字列値を有する他の属性と信頼して区別することができないことに注意すること。XPointer を処理するアプリケーションソフトウェアは、最初に、値がその Name 引数にマッチする宣言済みのIDをもつ要素を位置づけようと試みなければならない。もしそうできないならば、ユーザの選択で、アプリケーションソフトウェアは、求められている値を有する属性をもつ任意の要素を位置づけてもよい。

3.2.4 html キーワード

XPointer が html(NAMEVALUE) で始まるならば、ロケーションソースは、その型が A であり、NAMEVALUE に補われたのと同じ値の NAME で呼ばれる属性を有する最初の要素である。これは、まさに、HTML文書の文脈における "#" フラグメント識別子により果たされる機能である。

3.3 相対的ロケーションターム

このセクションで解説されるキーワードはロケーションソースの存在に依存する。明示的に与えられていなければ、ロケーションソースは包含リソースのルート要素である。これらのロケーションタームは、要素樹を通って上下左右にナビゲートするための機能を提供する。これらのロケーションタームはすべて同じ引数リストを受け付ける。

相対的ロケーションターム
[7]  RelTerm ::= Keyword? Arguments
[8]  Keyword ::= 'child'
| 'descendant'
| 'ancestor'
| 'preceding'
| 'following'
| 'psibling'
| 'fsibling'

これらのキーワードのそれぞれが、そこから結果のロケーションソースが選ばれることとなる元の要素またはその他のノード型の列を識別する。キーワードに渡される引数は、その列からどのノードが実際に選ばれるかを決定する。ここにまとめられた各キーワードは、以下のセクションにおいて詳細に解説される。

child
ロケーションソースの直接の子ノードを識別する。
descendant
ロケーションソースの内容の内部のどこかに現れるノードを識別する。
ancestor
ロケーションソースを包含する要素ノードを識別する。
preceding
ロケーションノードの前に現れる(先行する)ノードを識別する。
following
ロケーションソースの後に現れる(追随する)ノードを識別する。
psibling
ロケーションソースの前に現れる(先行する)兄弟ノード(親をロケーションソースと共有するノード)を識別する。
fsibling
ロケーションソースの後に現れる(追随する)兄弟ノード(親をロケーションソースと共有するノード)を識別する。

キーワードが省略されれば、それは直前のキーワードと等しいものとして扱われる。XPointer (埋め込まれたものを含む)の最初のロケーションタームからはキーワードが省略されてはならない。たとえば、以下の2つの XPointer は等価である。

child(2,SECTION).(1,SUBSECTION)
child(2,SECTION).child(1,SUBSECTION)

3.3.1 相対的ロケーションターム引数

すべての相対的ロケーションタームは、同じセットの潜在的引数を使って動作する。

相対的ロケーションターム引数
[9]  Arguments ::= '(' InstanceOrAll
(',' NodeType
(',' Attr ',' Val)*)? ')'

3.3.2 インスタンス数による選択

要素やその他のノード型は、出現数によって選択できる。

インスタンス
[10]  InstanceOrAll ::= 'all' | Instance
[11]  Instance ::= ('+' | '-')? [1-9] Digit*

正のインスタンス数n については、n番目の候補ロケーションが識別される。負のインスタンス数については、候補ロケーションは(各キーワードに特有の方法で)最後から最初に向かって数えられる。もし all というインスタンス値が与えられていれば、すべての候補ロケーションが選択される。範囲外の数は XPointer を失敗させる。

3.3.3 ノード型による選択

XMLサブリソースは、数だけでなく特定のノード型によっても選択できる。

ノード型
[12]  NodeType ::= Name
| '#element'
| '#pi'
| '#comment'
| '#text'
| '#cdata'
| '#all'

ノード型は、以下の値のうちの一つによって指定してよい。

Name
特定のXML要素型を選択する。指定された型の要素だけが候補として数えられることになる。たとえば、以下は、ロケーションソースの第3大分割の第4小分割の第29段落を識別する。
child(3,DIV1).child(4,DIV2).child(29,P)

以下の XPointer は文書内の最後の EXAMPLE 要素を選択する。

descendant(-1,EXAMPLE)
#element
XML要素を識別する。もし NodeType が指定されなければ、#element がデフォルトである。以下の例は5番目の子要素を識別する。
child(5)
#pi
XML処理命令を識別する。このノード型は、どの属性制約も満足できない。PI ロケーションソースとともに有意義に使うことができる唯一のロケーションタームは string である。
#comment
XML注釈を識別する。このノード型は、どの属性制約も満足できない。注釈ロケーションソースとともに有意義に使うことができる唯一のロケーションタームは string である。
#text
要素および CDATA 部の直接の内部にあるテキスト領域の間から選択する。このノード型は、どの属性制約も満足できない。テキスト領域ロケーションソースとともに有意義に使うことができる唯一のロケーションタームは string である。
#cdata
CDATA 部の内側で見つかったテキスト領域の間から選択する。このノード型は、どの属性制約も満足できない。CDATA 領域ロケーションソースとともに有意義に使うことができる唯一のロケーションタームは string である。
#all
上記すべての型のノードの間から選択する。要素を除くどのノードもどの属性も満足できないので、属性制約がつけられれば #all は実効的には #element と等価である。

ノード型のうちで、要素は他の型を包含できるが、その他の型は文字列以外のものを包含することができない。そこで、たとえば ancestor ロケーションタームは要素ノード型だけを位置づけ、descendant ロケーションタームは(他のノード型ではない)要素を通って、求める要素または非要素ノード型に至るまで下方にナビゲートする。

可能であるときには、指名された要素型による選択が強く推奨される。これ以上の情報は "3.8 リンクの永続性" を見ること。

以下の例を考えてみよ。

<!DOCTYPE SPEECH [
<!ELEMENT SPEECH (#PCDATA|SPEAKER|DIRECTION)*>
<!ATTLIST SPEECH
        ID      ID      #IMPLIED>
<!ELEMENT SPEAKER (#PCDATA)>
<!ELEMENT DIRECTION (#PCDATA)>
]>
<SPEECH ID="a27"><SPEAKER>Polonius</SPEAKER>
<DIRECTION>crossing downstage</DIRECTION>Fare you well,
my lord. <DIRECTION>To Ros.</DIRECTION>
You go to seek Lord Hamlet? There he is.</SPEECH>

以下の XPointer は、このリソース内部のさまざまなサブリソースを選択する。

id(a27).child(2,DIRECTION)
2つ目の "DIRECTION" 要素を選択する(内容は "To Ros." である)。
id(a27).child(2,#element)
2つ目の子要素(すなわち最初の direction であり、その内容は "crossing downstage" である)を選択する。
id(a27).child(2,#text)
"Fare you well, my load." という2つ目のテキスト領域を選択する。(SPEAKER 要素と DIRECTION 要素との間の改行が最初のテキスト領域である。)

3.3.4 属性による選択

候補要素は、その属性名および値に基づいて選択できる。非要素ノード型は属性をもたず、そのため属性名や値の指定を含むセレクタを決して満足できないことに注意すること。

属性
[13]  Attr ::= '*' /* 任意の属性名 */
Name
[14]  Val ::= '#IMPLIED' /* no value specified, no default */
| '*' /* 任意の値.欠けていてもよい. */
Name
SkipLit /* 正確な合致 */

引数 Attr および Val は、候補要素の中からの選択の際に使うための属性名および値を与えるために使われる。

引用符の内部に指定されていれば属性値引数は大文字小文字を区別されるが、そうでなければ区別されない。

それがどの属性名の値であるかにかかわらず、属性値が制約を構成する(さほどあるわけではない)場合には、ロケーションタームの中で属性名を "*" と指定してもよい。

たとえば、以下のロケーションタームは、TARGET という属性が値を有するロケーションソースの最初の子を選択する。


child(1,#element,TARGET,*)

以下の XPointer は、N 属性を使って要素を選択する。


child(1,#element,N,2).(1,#element,N,1)

ロケーションソースの最初では、2 という値をもつ N 属性のある最初の子(要素型は何でもよい)が選択される。その後、同じ属性に 1 という値をもつその要素の最初の子要素が選択される。非要素ノード型は、N 属性をもつことができないから選択されえない。

以下の例は、RESP 属性が指定されないままである FS 要素であるロケーションソースの最初の子を選択する。

child(1,FS,RESP,#IMPLIED)

html というキーワードは、属性ベースのアドレッシングのきわめて特定的なインスタンスと同義であり、以下の2つの XPointer は等価であることに注意すること。

html(Sec3.2)
root().descendant(1,A,NAME,"Sec3.2")

3.3.5 descendant キーワード

descendant キーワードは、直接または間接にネストされた、ロケーションソース内部のどこかにある指定された型のノードを選択する。

descendant ロケーションタームは、サブ要素樹を下に向かって見てゆき、要求されたノード型で終了する。中間のPIや注釈、テキスト領域のネストされたレベルを通っては下っていかない。合致するノード型の検索は、XMLデータストリームの中で要素の開始タグが発生するのと同じ順序で発生する。ロケーションソースの最初の子がまずテストされ、その後(それが要素テレある場合には)その要素の最初の子が、などとテストされてゆく。形式的な用語では、これは深さ優先のトラバーサルである。

たとえば、以下の XPointer は、ID 属性の値が A23 である要素の内部にある、値が DE である LANG 属性をもった2つ目の TERM を選択する。

id(a23).descendant(2,TERM,LANG,DE)

インスタンス数が正であれば、検索は深さ優先で、左から右へと行われる。インスタンス数が負であれば、検索は深さ優先であるが、右から左に行われ、最も右で最も深くにある合致する要素が -1 という番号をつけられるなどする。要素が試験される順序は、遭遇した最初のタグの発生順序に一致する。そこで、以下の例では、文書の最後の NOTE 要素、すなわち最も右の終了タグをもつものを選択する。


root().descendant(-1,NOTE)

もし最後の NOTE が他の NOTE の内部にあったならば、サブ要素ではなく包含要素が選ばれる。そちらの方が文書の中で後ろの点まで広がっているからである。

3.3.6 ancestor キーワード

ancestor キーワードは、ロケーションソースの直接の祖先の間から要素を選択する。正のインスタンス数については、ロケーションソースの親から包含リソースのルートへと上向きに数えられる。負のインスタンス数については、ルートから直接の親要素へと下向きに数えられる。ancestor はロケーションソース自身を選択できないことに注意すること。

たとえば、以下の XPointer は、まず、ロケーションソースを適切に包含し、かつ属性 N1 という値をもつ最も内側の要素(直近の祖先)を選び、そこから、その祖先を適切に包含する最も小さい DIV 要素を選ぶ。

ancestor(1,#element,N,1).(1,DIV)

ancestor のノード型パラメータは、もし補われていれば、#element か特定の要素型名かのどちらかでなければならない。もし現在のロケーションソースが属性であれば、その属性が発生する要素が最初の祖先とみなされる。

3.3.7 preceding キーワード

preceding キーワードは、ロケーションソースに先行するものの中から指定された型のノードを選択する。選択されてよいノードのセットは、文書全体の中で、ロケーションソースの前で発生または開始するものすべてのセットである。正のインスタンス数については、ロケーションソースから左へと数えられる。負のインスタンス数については、包含リソースのルート要素から右へと数えられる。開始、終了を問わず遭遇した最初の区切り子またはタグが、そのノードの発生と数えられる。

たとえば、以下の XPointer は、a23 という ID をもった要素の前で発生または開始する5番目の要素を指し示す。


id(a23).preceding(5,#element)

ロケーションソースの祖先はすべてそのロケーションソースを包含し、潜在的には他の内容も包含するから、祖先はその子孫に「先行」しかつ「後行」する。それゆえ、以下の例はルート要素を選択する(おそらく他のノードの中から)


id(a23).preceding(all)

3.3.8 following キーワード

following キーワードは、ロケーションソースに後行するものの中から指定された型のノードを選択する。選択されてよいノードのセットは、文書全体の中で、そのロケーションソースの後で発生または終了するものすべてのセットである。正のインスタンス数については、ロケーションソースから右へと数えられる。負のインスタンス数については、包含リソースのルート要素の終了タグから左へと数えられる。開始、終了を問わず最初に遭遇した区切り子またはタグが、そのノードの発生として数えられる。

たとえば、以下の XPointer は、a23 という ID をもつ要素の後に発生する2番目のPIを指し示す。

id(a23).following(2,#pi)

ロケーションソースの祖先はすべてそのロケーションソースを包含し、潜在的に他の内容も包含するから、祖先はその子孫に「先行」しかつ「後行」する。それゆえ、以下の例はルート要素を選択する(おそらく他のノードの中から)。


id(a23).following(all)

3.3.9 psibling キーワード

psibling キーワードは、同じ親要素の内部でそのロケーションソースに先行するものの中から指定された型のノードを選択する。同じ親要素によって直接に包含されているノードは、兄弟である。ロケーションソースに先行する兄弟はその年長の兄弟であり、後行する兄弟は年下の兄弟である。

正のインスタンス数については、psibling は、最も近い年上の兄弟から最も年上の兄弟へと左向きに数えられる。負のインスタンス数については、最も年上の兄弟から右向きに数えられる。ロケーションソースが、少なくともインスタンス数の絶対値と同じだけの年上の兄弟をもっていなければ、ロケーションタームは失敗である。

たとえば、この XPointer は、同じ親を共有している限りにおいて、a23 という ID をもつ要素の直前にある要素を指し示す。

id(a23).psibling(1,#element)

もしロケーションソースが少なくとも1つの年上の兄弟をもっていれば、以下のロケーションタームはまさに最も年上はまさに最も年上の兄弟を指し示す。

psibling(-1,#element)

このロケーションタームは、以下の XPointer と同義である。

1,#element).child(1,#element)

all という値を使って、ある要素の年上の兄弟の範囲全体を選択してもよい。たとえば、以下の XPointer は、a32 という ID をもつ要素に先行し、同じ親に包含されている要素のセットを指し示す。

id(a23).psibling(all,#element)

3.3.10 fsibling キーワード

fsibling キーワードは、同じ親要素の内部でそのロケーションソースに後行するものの中から指定された型のノードを選択する。同じ親要素に直接に包含されているノードは、兄弟である。ロケーションソースに先行する兄弟はその年上の兄弟であり、後行するものは年下の兄弟である。

正のインスタンス数については、fsibling は最も近い年下の兄弟から最も年下の兄弟へと右向きに数えられる。負のインスタンス数については、最も年下の兄弟から左向きに数えられる。ロケーションソースが少なくともインスタンス数の絶対値と同じだけの年下の兄弟をもっていなければ、ロケーションタームは失敗である。

たとえば、この XPointer は、同じ親を共有する限りにおいて、a23 という ID をもつ要素の直後にある要素を指し示す。

id(a23).fsibling(1,#element)

ロケーションソースが少なくとも1つの年下の兄弟をもっていれば、以下のロケーションタームはまさに最も年下の兄弟を指し示す。

fsibling(-1,#element)

このロケーションタームは、以下の XPointer と同義である。

ancestor(1,#element).child(-1,#element)

all という値を使って、ある要素の年下の兄弟の範囲全体を選択してもよい。たとえば、以下の XPointer は、a23 という ID をもつ要素が続き、同じ親に包含される要素のセットを指し示す。

id(a23).fsibling(all,#element)

3.4 スパニングロケーションターム

span キーワードは、その最初の引数によって選択されるデータの開始点で始まって2つ目の引数によって選択されるデータの終了点まで続くサブリソースを位置づける。両方の引数はともに、スパニングロケーションターム自身のロケーションソースとの相対関係で解釈される。2つ目の引数は最初の引数をロケーションソースとして使うのではない。

スパニングターム
[15]  SpanTerm ::= 'span(' XPointer ',' XPointer ')'

以下は、a23 というIDをもつ要素の1つ目から3つ目までの子を選択するスパニング XPointer の例である。

id(a23).span(child(1),child(3))

3.5 属性ロケーションターム

attr キーワードは、セレクタとして属性名のみをとり、その属性値を返す。

属性マッチターム
[16]  AttrTerm ::= 'attr(' Name ')'

3.6 文字列ロケーションターム

string キーワードは、ロケーションソース内の文字列の間で1つ以上の文字列またはポジションを選択する。

文字列マッチターム
[17]  StringTerm ::= 'string(' InstanceOrAll ',' SkipLit (',' Position (',' Length')?)?)'
[18]  Position ::= ('+' | '-')? [1-9] Digit* | 'end'
[19]  Length ::= [1-9] Digit*
InstanceOrAll
指定された文字列のn回目の発生を識別する。正のインスタンス数については、ロケーションソースの最初から右へと数える。負のインスタンス数については、ロケーションソースの末尾から左へと数える。all という値については、その文字列のすべての発生が、指し示されるリソースの形成に際して候補として使われる。
SkipLit
ロケーションソース内部で発見された候補文字列を識別する。ヌル SkipLit 文字列は、ロケーションソース内の各キャラクタの直前のポジションを識別する。たとえば、x37 というIDをもつ要素が "Thomas" というキャラクタ文字列を包含していると仮定すると、以下の XPointer は3キャラクタ目 ("o") の前のポジションを識別する。
id(x37).string(3,"")
Position
候補文字列の最初から、求められる最後の文字列マッチの最初までのキャラクタオフセットを識別する。ポジション数は0であってはならない。もし省略されれば1とみなされる。正のポジション数は、指定された文字列の最初から右へと数える。負のポジション数は、文字列の最後から左へと数える。たとえば -1 というポジションは、マッチの中の最後のキャラクタの直前のポジションである。end というポジジョン値は、マッチの最後のキャラクタの直後のポジションを選択する。
Length
選択されるキャラクタ数を指定する。長さが0であったり省略されている場合には、Position で示されたキャラクタの前にあるまさにその点を参照する。

ロケーションソースがPIまたは注釈であるときは、string は、そのノードの内容上で動作する。しかしながら、PIや注釈の内容は、それ以外の場合にはテキスト内容とみなされない。

たとえば、以下のXPointerは、"Thomas Pynchon" という文字列の3度目の出現の中の "P" という文字 (文字列の最初から8番目)の直前の位置を選択する。

root().string(3,"Thomas Pynchon",8)

以下のXPointerは、5番目の感嘆符と、その直後に続く文字とを選択する。

id(a27).string(5,'!',1,1)

文字列照合の目的では、「要素のテキスト」とは、カレントのロケーションソースの中にある要素および子孫要素にあるすべてのキャラクタデータを意味する。マークアップキャラクタは無視される。パターン照合は、厳密かつキャラクタごとである。いかなる種類の大文字小文字やスペース、結合キャラクタの標準化も実行されるべきではない。そのため、以下の例だと "Thomas Pynchon" に合致するものはないことになる。合致しそうな最初のものは大文字小文字が違っており、二番目のものは単語を区切るスペースの省略の点で異なる。

<example>thomas pynchon,
<auth><first>Thomas</first><family><br/>Pynchon</family></auth>,
Thomas
Pynchon</example>

3.7 単なるノードではないロケーション

ほとんどのロケーションタームは、その結果として単一の要素を選択する。たとえば、以下のXPointerは、つぎの1個の要素を選択する。

id(foo).child(1,SEC)

そうしたケースは平凡に要素樹内のノードに対応しており、そのようにして一定の実装の単純化を可能にしている。しかしながら、この限界がすべてのロケーションタームにあるわけではない。

  1. string ロケーションタームは、一般に、1個のノードの一部分だけを返す。しかし、合致した内容の中にマークアップがある場合には、複数の要素の一部分が結果に含まれてもかまわない。
  2. string ロケーションタームは、all インスタンス値つきで使われるときは、文字列データのうちの、概して不連続である部分のリストを返す。
  3. 相対ロケーションタームは、インスタンス引数を all と指定してもよい。これは、すべての候補ノードが結果に含まれることを意味している。そこで、結果は、サブツリーではなく、たぶん非隣接であるノードのベクトルとなる。
  4. スパニングXPointerは、多様な要素を部分的にのみ組み込んでもよい。

これらのケースはそれぞれ、下記で詳細に解説される。

3.7.1 スパニング文字列

string ロケーションタームは、数個の要素のうちの部分を返してもよい。たとえば、下記の "c" で始まる12文字を指定する string だと、EMPH 要素のテキスト内容全体に加えて、P の内部で EMPH に続いているテキスト部分を返すことになる。

<P>Hello, <EMPH>cruel</EMPH> world.</P>

3.7.2 all キーワード

下記に示されたXPointerは、要素の有順序リストを指定する。要素は連続的であってもなくてもよい。前者のケースでは恐らく連続的であり、その次のケースでは恐らく連続的ではない。

id(sec2.1).child(1,list).child(all,list)
id(div1).descendant(all,h3) 

このような要素の不連続的な連なりは、一定の処理シナリオにおけるクエリーの結果を表す、基礎にある同一の抽象型を用いて有益に実装してもかまわない。

3.7.3 スパニングXPointer

以下のスパニングXPointerは、ある節の最後の P 要素から、別の節の最初の P までにあるすべてのものを選択する。

span(id(sec2.1).child(-1,P),id(sec2.2).child(1,P))

スパンロケータはXML文書のサブツリーではなく、また、単なる内容データ文字列でもない。そこで、スパニング選択の結果は、一般的に、整形式のXML文書として表記したり、ノードや要素樹からのノードのリストとして表記することができない。これは、一般的に要素のなかには、スパンの中にも外にもなく、実は一部分だけが中にあるものがあるからである。たとえば、上記の例には、sec2.1 というIDをもつ要素の末尾が含まれているが、先頭は含まれていない。このため、スパンをサポートする実装は、スパンを単純に単一のノードや整形式のXMl文書として表現することができないのである。その代わりに、実装は、それらをロケーションの対として、またはその他それ以上に一般なものを表記できる手段により、表現しなければならない。

ノードやノードのベクトルにとって意味をなす処理用意味論のなかには、スパンについて意味をなさないものがあるかもしれない。ブラウザは、あるスパンのキャラクタ内容だけを強調表示することならば簡単にできるが、アウトライン化表示や樹形式表示に適用すべき適切な意味論はないことがある。

3.8 リンク永続性

ターゲットリソースへのリンクが決して切れないことを保証することは不可能である。リソースを、どれだけ頑強なリンクであっても切れるように変化させることは可能である。最悪の場合、ターゲットリソースの制作者は、ターゲットリソースを書き換えて全く別の主題を論じれば、リンクがIDを用いてリソースを参照している場合であっても、すべてのリソースを無関係なものにすることができるのである。しかしながら、典型的な条件の下では、いくつかのXPointerは合理的な程度に頑強なものとなりうる。

もっとも頑強なロケータは、たいていはIDのみを用いたものであり、これは利用可能なときには好まれるロケータである。しかしながら、すべての要素にIDがあるとは限らず、リンクの作成者には、ターゲットリソースにIDを追加できるほどの制御力がないことが多い。そうした場合には、IDを実際にもっている直近の包含側要素を指し示し、そこから child ロケーションタームを用いて要素樹を下っていくロケータが、好まれるロケータである。この形式は、二つの理由で、相対的に頑強である。

さらに、child といったような相対ロケーションタームが使われているところでは、指名された要素型による選択 (相対ロケーションタームの2番目の引数に Name がある場合) が、二つの理由で、名前の指定のない選択よりも好まれる。

4. 適合性

文字列は、それがこの仕様書によって課されている文法的な要求事項を厳守している場合に、XPointerに適合している。これは、URIとの関連において、文字列が、与えられたある瞬間において存在するリソースを実際に指し示していることを要求するものではないので注意すること。

アプリケーションソフトウェアは、それが、XPointerに適合している文字列を、この仕様書によって指定された必須の意味論のすべてに従って解釈し、また、それがサポートすることを選んだオプショナルな意味論のどれについても、それらを指定されたとおりにサポートする場合に、Xpointerに適合する。アプリケーションソフトウェアは、XPointer文字列がどの場所で認識されるかについて、独自の要求事項を定義しても自由である。たとえば、あるXMLアプリケーションプログラムは、XLink要素のロケータ属性の中に出現するときにのみXpointerを認識することとするかもしれないのである。


付録

A. 未了の作業

A.1 属性値の大文字小文字の区別

あるリンクのリソースを属性の値に基づいて指定することは可能である。照合の際に大文字小文字の区別に関して何が正しい挙動であるかを決定することは困難なことである。理想的には、属性値の宣言型が考慮に入れられるべきであるが、それは文書のDTDを取り出して読むことを前提としており、それは多くのXMLアプリケーションでは適切ではないことがある。現行のシステムは、説明は簡単であるけれども、長い目で見れば適していないことが判明するかもしれない。

A.2 XPointers と抽象的データ型

形式的には、XPointer 機構の操作は、DOMや HyTime 規格 ([ISO/IEC 10744]) に定義されているような抽象的データ構造上の操作として指定される場合がある。そうしたロケータの中のノードごとにSDQLでの対応する表現があり、大半は HyTime ロケーションモジュールにおける直接の等価物もある。

B. XPointers とTEI拡張ポインタ

XPointer 言語は、the Text Encoding Initiative guidelines [TEI] に定義された、多様なSGMLベースのハイパーメディアアプリケーションによって利用されている公に利用可能な技術である「拡張ポインタ」を基礎としている。この付録は、XPointer が拡張ポインタとどう違うのかを解説する。主要な相違点は、URI内部に簡単にロケータをパッケージする能力を有し、いくつかのより進んだ機能を省いていることである。

これらの変更点はTEIとコミュニケートされており、TEIは以後の見直しにおいてける組み込みのためにそれらを考慮している。

提案中のTEIキーワード ATTR は XPointer に組み込まれている。

C. 参照資料

XLINK
Eve Maler and Steve DeRose, editors. XML Linking Language (XLink) V1.0. ArborText, Inso, and Brown University. Burlington, Seekonk, et al.: World Wide Web Consortium, 1998. (http://www.w3.org/TR/WD-xlink を見ること。1998年3月3日版については拙訳あり。)
ISO/IEC 10744
ISO (International Organization for Standardization). ISO/IEC 10744-1992 (E). Information technology --Hypermedia/Time-based Structuring Language (HyTime). [Geneva]: International Organization for Standardization, 1992. Extended Facilities Annex. [Geneva]: International Organization for Standardization, 1996. (http://www.ornl.gov/sgml/wg8/docs/n1920/html/n1920.html を見ること。)
IETF RFC 1738
IETF (Internet Engineering Task Force). RFC 1738: Uniform Resource Locators. 1991. (http://www.w3.org/Addressing/rfc1738.txt を見ること。)
IETF RFC 1808
IETF (Internet Engineering Task Force). RFC 1808: Relative Uniform Resource Locators. 1995. (http://www.w3.org/Addressing/rfc1808.txt を見ること。)
TEI
C. M. Sperberg-McQueen and Lou Burnard, editors. Guidelines for Electronic Text Encoding and Interchange. Association for Computers and the Humanities (ACH), Association for Computational Linguistics (ACL), and Association for Literary and Linguistic Computing (ALLC). Chicago, Oxford: Text Encoding Initiative, 1994.
DOM
Document Object Model Specification. World Wide Web Consortium, 1997. (http://www.w3.org/TR/WD-DOM を見ること)
CHUM
Steven J. DeRose and David G. Durand. 1995. "The TEI Hypertext Guidelines." In Computing and the Humanities 29(3). Reprinted in Text Encoding Initiative: Background and Context, ed. Nancy Ide and Jean Véronis, ISBN 0-7923-3704-2.

著作権  ©  1998 W3C(マサチューセッツ工科大学フランス国立情報処理自動化研究所慶應義塾大学).すべての権利が留保されている。W3Cの免責(liability), 商標(trademark), 文書利用(document use), ソフトウェア使用許諾(software licensing) 規則が適用される。


どら猫本舗 (webmaster@doraneko.org)