この文書では、 JavaScript を使った XPointer の実装を紹介します。
XPointer は XML の素片識別子などとして使うことが想定された指示子です。 XPointer の構文には、識別子を使って要素を識別する速記指示子と、 scheme によって文書の任意の部分資源を識別できる構文の2種類があります。
この文書で紹介するのは、 JavaScript を使った XPointer の実装とその界面です。このスクリプトを使えば、 HTML や XML の文書で XPointer 指示子を評価させることができます。
XPointer では scheme は拡張可能に定義されています。このスクリプトでは簡単に scheme の処理を実装することができます。
xpointer.js
は次の界面により
XPointer
を実装しています。また、予め速記指示子と
XPointer scheme
として element()
および
xmlns()
に対応しています。
XPointerSchemeProcessor
を使えば更に他の
scheme
にも対応できます。
この界面やその実装はまだ検討中のもので、 将来変更される可能性があります。必要があれば CVS repository の配布ファイルも参照して下さい。
XPointerEvaluator
界面 XPointerEvaluator
は
XPointer
指示子を評価するためのメソッドを提供します。
この界面は指示子や指示子を評価する文脈となる文書とは独立したものです。
JavaScript では、構築子を使って次のようにこの界面を実装した物体を取得できます。
var xp = new XPointerEvaluator ();
interface XPointerEvaluator {
XPointerResult evaluate(in Document contextDocument,
in DOMString xpointer)
raises(XPathException);
XPointerSchemeProcessor
getXPointerSchemeProcessor
(in DOMString namespaceURI,
in DOMString localName);
void setXPointerSchemeProcessor
(in DOMString namespaceURI,
in DOMString localName,
in XPointerSchemeProcessor sp);
};
evaluate
XPointer 指示子を与えられた文書の元で評価し、 識別された部分資源を返します。
XPointerResult
XPathException
INVALID_EXPRESSION_ERR
:
指示子が不正であるか、
文書内のどの部分資源も識別しない時に発生します。getXPointerSchemeProcessor
指定された XPointer scheme の処理器を返します。
namespaceURI
(型 DOMString
)null
を指定します。
長さ0の文字列は null
と同じ意味です。localName
(型 DOMString
)XPointerSchemeProcessor
null
。
namespaceURI
と
localName
の両方が null
の時は、速記指示子用の処理器を返します。setXPointerSchemeProcessor
指定された XPointer scheme の処理器を設定します。 既に処理器が登録されているときは置き換えます。
namespaceURI
(型 DOMString
)null
を指定します。
長さ0の文字列は null
と同じ意味です。localName
(型 DOMString
)sp
(型 XPointerSchemeProcessor
)XPointerSchemeProcessor
界面 XPointerSchemeProcessor
を実装した物体は、
を使って
XPointerEvaluator
.setXPointerSchemeProcessor
XPointerEvaluator
に登録して特定の scheme
のデータを処理させることができます。
JavaScript では、構築子を使って次のようにこの界面を実装した物体を作成できます。
var sp = new XPointerSchemeProcessor (function (doc, context, data) {
/* XPointerSchemeProcessor.evaluate メソッドの実装 */
});
interface XPointerSchemeProcessor {
XPointerResult evaluate(in Document contextDocument,
in XPointerSchemeContext schemeContext,
in DOMString schemeData);
};
evaluate
与えられた scheme データを評価し、 識別された部分資源を返します。
contextDocument
(型 Document
)schemeContext
(型 XPointerSchemeContext
)schemeData
(型 DOMString
)^
による逃避は元に戻された状態で渡されます。XPointerResult
XPointerResult
.hasSubresources
は true
、そうでない場合には
false
にします。XPointerSchemeContext
界面 XPointerSchemeContext
は、
XPointerSchemeProcessor
が scheme データを評価するために必要な文脈を提供します。
現在この界面は名前空間束縛文脈の情報だけを提供していますが、 将来の版では更に他の文脈情報も提供するかもしれません。
interface XPointerSchemeContext {
DOMString lookupNamespaceURI(in DOMString prefix);
void addNamespaceBinding(in DOMString prefix,
in DOMString namespaceURI);
};
lookupNamespaceURI
addNamespaceBinding
XPointerResult
指示子を評価した結果は XPointerResult
を実装した物体によって返されます。
この物体をどう実装するかはその実装に依存します。
結果を返す方法には更に検討が必要です。 将来の版では界面が変更されるかもしれません。
JavaScript では、便宜上新しい XPointerResult
を生成するための静的メソッドを用意しています。
// 空 (一致する部分資源なし) の結果
result = XPointerResult.createEmptyeXPointerResult ();
// 節点が1つだけの結果
// code が null
なら createEmptyXPointerResult
と同じ
result = XPointerResult.createNodeXPointerResult (node);
interface XPointerResult {
// XPointerResultType
const unsigned short UNORDERED_NODE_ITERATOR_TYPE = 4;
const unsigned short ORDERED_NODE_ITERATOR_TYPE = 5;
const unsigned short UNORDERED_NODE_SNAPSHOT_TYPE = 6;
const unsigned short ORDERED_NODE_SNAPSHOT_TYPE = 7;
const unsigned short ANY_UNORDERED_NODE_TYPE = 8;
const unsigned short FIRST_ORDERED_NODE_TYPE = 9;
readonly attribute unsigned short resultType;
readonly attribute Node singleNodeValue;
// raises(XPathException) on retrieval
readonly attribute boolean hasSubresources;
};
hasSubresources
(型 boolean
, 読取専用)指示子が文書の部分資源を識別し、
その結果をこの物体が持っているのであれば
true
、そうでなければ false
。
HTML にはスタイル・シート (の組) を利用者が選択できる機能が備わっていますが、 これを素片識別子から選択することを試みます。まずは使用例をご覧下さい。
この例では、名前によってスタイル・シートを選択する
という
scheme
などを
style:
()style
XPointerSchemeProcessor
の実装によって導入しています。使用例や使用例へのリンクがある文書にあるリンクは、
この scheme
を使った素片識別子を使っています。
スクリプトでは、文書が読み込まれた時とリンクが活性化された時に関数
reevaluateFragment()
を実行するように指定しています。この関数は素片識別子から XPointer
を取り出し、 XPointer 処理器に渡します。
<http://suika.fam.cx/~wakaba/archive/2005/3/style/>
style
SchemeData
title
属性)
の代替スタイル・シート
(優先スタイル・シートを含みます。)
の集合を有効にし、他の代替スタイル・シート
(優先スタイル・シートを含みます。)
を無効にします。<http://suika.fam.cx/~wakaba/archive/2005/3/window/>
title
SchemeData
<http://suika.fam.cx/~wakaba/archive/2005/3/xpointer/>
document
URI の素片識別子は資源の一部分や見え方を識別します [RFC 3986]。 XPointer scheme はほとんどどんな指示でも与えることができますが、 この意味から逸脱しない範囲にとどめるべきです。
The fragment identifier component of a URI allows indirect
identification of a secondary resource by reference to a primary
resource and additional identifying information. The identified
secondary resource may be some portion or subset of the primary
resource, some view on representations of the primary resource, or
some other resource defined or described by those representations.
また、素片識別子の構文はその資源の媒体型によって定義されることになっています。 使用する文書の媒体型の定義にできるだけ沿った形で利用するべきです。
Web ブラウザにおける表示などを URI の一部により制御可能とすると、なりすましなどに悪用される危険性があります。 XPointer scheme の設計は慎重に行うべきです。
setTimeout
で定期的に確認すれば解決できるでしょうが...)
関連するファイルは
Perl/MPL 1.1/GPL 2.0/LGPL 2.1
で配布しています。詳しくは各ファイルの注釈をご覧下さい。
location.hash
を使ったセッション復元関連。