XMLパス言語 (XPath) (original) (raw)
XMLパス言語 (XPath) Version 1.0
- この文書は、W3Cにより作成されW3C勧告として公開されている "XML Path Language (XPath) Version 1.0" (http://www.w3.org/TR/1999/REC-xpath-19991116) を、どら猫本舗が翻訳したものです。
- この文書の原文はワーキングドラフトです。将来の改訂が予定されていることにご注意ください。最新版の仕様書は http://www.w3.org/TR/xpath にあります。
- 正式な仕様書はW3Cサイトにある英語版です。この日本語版は参考にすぎません。
- この文書には翻訳上の誤りがあるかもしれません。どら猫本舗は翻訳の正確性を保証しません。あくまでご自身の責任でご利用ください。
- お気付きの点がありましたらどら猫本舗までお知らせください。
概要
XPathは、XML文書の一部分をアドレッシングするための言語であり、XSLTとXPointerとの双方で利用されるよう設計されている。
この文書の位置づけ
この文書は、W3C会員およびその他の利害関係者によりレビューされ、ディレクターによってW3C勧告(Recommendation)として公布されているものである。この文書は安定的な文書であって、参照素材として利用したり、他の文書から規範的リファレンスとしての引用に利用してもかまわない。勧告を作成する際のW3Cの役割は、仕様に対する注意を引き、その広範な配備を推進することになる。このことは、ウェブの機能と相互運用性とを高める。
この仕様書[原文]の既知のエラーの一覧は http://www.w3.org/1999/11/REC-xpath-19991116-errata で入手することができる。
この仕様書[原文]に関するコメントは www-xpath-comments@w3.org へ送られたい。コメントのアーカイブが利用可能である。
この仕様書は英語版が唯一の規範的バージョンである。もっとも、この文書[原文]の翻訳を探しているのであれば、http://www.w3.org/Style/XSL/translations.html を見てみること。
現行のW3C勧告およびその他の技術文書の一覧は http://www.w3.org/TR で見ることができる。
この仕様書は、XSLワーキンググループとXMLリンキング ワーキンググループとの合同作業であり、そこで、W3Cスタイルアクティビティの一部であり、かつW3C XMLアクティビティの一部である。
目次
1 はじめに
2 ロケーションパス
2.1 ロケーションステップ
2.2 軸
2.3 ノードテスト
2.4 述部
2.5 省略文法
3 式
3.1 基本事項
3.2 関数呼び出し
3.3 ノードセット
3.4 ブール値
3.5 数値
3.6 文字列
3.7 レキシカルな構造
4 コア関数ライブラリ
4.1 ノードセット関数
4.2 文字列関数
4.3 ブール値関数
4.4 数値関数
5 データモデル
5.1 ルートノード
5.2 要素ノード
5.2.1 一意的ID
5.3 属性ノード
5.4 名前空間ノード
5.5 処理命令ノード
5.6 注釈ノード
5.7 テキストノード
6 適合性
付録
A 参照資料
A.1 規範的な参照資料
A.2 その他の参照資料
B XML情報セットの割り付け (非規範的)
1 はじめに
XPathは、XSL変形[XSLT]とXPointer[XPointer]との間で共有されている機能について、共通の文法と意味論とを用意しようという努力の成果である。XPathの主たる目的は、XML[XML]文書の一部分をアドレッシングすることである。この主目的を支えるため、XPathは、文字列や数値、ブール値の操作をするための基本的な装置も用意する。XPathは、URIやXML属性値の中でXPathを使いやすくするため、コンパクトな非XML文法を使う。XPathは、XML文書の表面的な文法ではなく、抽象的な論理構造に作用する。XPathの名前は、URLと同じように、XML文書の階層構造を通じてのナビゲーションのためにパス表記を利用するところからつけられている。
アドレッシングのための利用に加えて、XPathは、照合(あるノードがあるパターンに合致しているかどうかのテスト)に利用できる自然なサブセットをもつようにも設計されている。このようなXPathの利用法はXSLTで解説されている。
XPathは、XML文書を、ノードの樹としてモデル化する。ノードには、要素ノード、属性ノード、テキストノードというように、いろいろな型がある。XPathは、それぞれの型のノードについて、その文字列値を計算する方法を定義する。ノードの型の中には、名前を取るものもある。XPathは、XML名前空間[XML Names]を完全にサポートしている。そこで、ノードの名前は、ローカル部分1個と、ヌルでもよいが名前空間URI1個とからなるペアとしてモデル化される。これは展開名と呼ばれる。データモデルについては、[5 データモデル]で詳しく解説する。
XPathにおいて主たる文法構造は、式である。式とは、生成規則 Expr に合致するものである。式は評価されてオブジェクトを生み出すが、このオブジェクトは以下の4つの基本形のうちの一つをとる。
- ノードセット (ノードの重複のない無順序の集合)
- ブール値 (真または偽)
- 数値 (浮動小数点数)
- 文字列 (UCSキャラクタの連なり)
式の評価は、文脈との関係で発生する。XSLTやXPointerは、それぞれXSLTやXPointerで使われているXPath式について文脈をどのように決定するかを規定している。文脈は、次のものからなる。
- ノード1個 (文脈ノード)
- 非零正整数1対 (文脈ポジションと文脈サイズ)
- 変数バインディング1セット
- 関数ライブラリ1個
- その式のスコープ内にある名前空間宣言のセット
文脈ポジションは、つねに文脈サイズ以下である。
変数バインディングは、変数名から変数値への割り付け関係からなる。変数の値はオブジェクトであり、これは式の値が取りうる型のどれかであってもよく、ここには規定されていない追加型のものであってもかまわない。
関数ライブラリは、関数名から関数への割り付け関係からなる。関数はそれぞれ、0個以上の引数を取り、単一の結果を返す。この文書は、すべてのXPath実装物がサポートしなければならないコア関数ライブラリを定義する([4 コア関数ライブラリ]を見よ)。コア関数ライブラリの関数については、変数や結果は四基本形のものである。XSLTもXPointerもともに、追加の関数を定義してXPathを拡張する。これらの関数の中には、四基本形に作用するものもある。XSLTやXPointerで定義された追加のデータ型に作用するものもある。
名前空間宣言は、プリフィックスから名前空間URIへの割り付け関係からなる。
部分式を評価するために使われる変数バインディング、関数ライブラリ、名前空間宣言は、親式を評価するのに使われるものとつねに同じである。部分式を評価するために使われる文脈ノード、文脈ポジション、文脈サイズは、親式を評価するのに使われるものと時には異なる。いくつかの種類の式は、文脈ノードを変更する。文脈ポジションや文脈サイズを変更するのは述部だけである([2.4 述部]を見よ)。ある種類の式の評価を解説するときには、部分式の評価のために文脈ノードや文脈ポジション、文脈サイズが変化する場合には、つねに明示的に述べることとする。文脈ノードや文脈ポジション、文脈サイズについて何もいわれていない場合には、それらは、その種類の式の部分式の評価のために変更されないままである。
XPath式がXML属性の中に出現することはしばしばある。この節に規定されている文法は、XML 1.0 標準化の後の属性値に適用される。そこで、たとえば、文法で <
というキャラクタが使われている場合には、これはXMLソースの中では <
としては出現してはならず、XML 1.0 の規則に従って、たとえば、<
として入れることにより、クオートとしなければならないのである。式の中では、リテラル文字列は、単引用符または二重引用符で区切られるが、これらの引用符はXML属性を区切るのにも使われる。XMLプロセッサが式の中の引用符を属性値の終結として解釈することを避けるため、引用符はキャラクタ参照("
や '
)として入れることができる。これに代えて、XML属性が二重引用符で区切られている場合には式は単引用符を使うことができ、またその逆も可能である。
式の種類のうち重要なひとつが、ロケーションパスである。ロケーションパスとは、文脈ノードに対する相対関係において、ノードのセットを選択するものである。ロケーションパスである式を評価した結果は、そのロケーションパスによって選択されるノードを包含するノードセットである。ロケーションパスは、再帰的に、ノードのセットをフィルタリングするのに使われる式を包含することができる。ロケーションパスは、生成規則 LocationPath に合致するものである。
以下の文法において、中間生成規則 QName および NCName は[XML Names]で定義され、S は[XML]で定義されている。文法は、[XML]と同じEBNF表記法を用いている(ただし、文法の記号は頭文字がつねに大文字であることを除く)。
式の解析は、まずキャラクタ文字列をトークンに分割し、その後に結果のトークン列を解析してなされる。空白は、トークン間で自由に使うことができる。トークン化処理については[3.7 レキシカルな構造]で解説する。
2 ロケーションパス
ロケーションパスは、言語の中でもっとも一般性を有する文法構造物ではない(LocationPath は Expr の特殊なケースである。)が、最も重要な構造物であり、そこで最初に解説することとする。
どのロケーションパスも、素直であるがややうるさい文法を用いて表記することができる。よくあるケースを簡潔に表記することを可能にする文法的省略形も数多くある。この節では、非省略文法を用いたロケーションパスの意味論を説明することとする。省略文法は、その後に、省略文法がどのように非省略文法へと展開されるかを示すことにより説明することとする([2.5 省略文法]を見よ)。
こちらは、非省略文法を用いたロケーションパスの例である。
child::para
は、文脈ノードの子para
要素を選択する。child::*
は、文脈ノードの子要素すべてを選択する。child::text()
は、文脈ノードの子テキストノードすべてを選択する。child::node()
は、そのノード型を問わず、文脈ノードの子すべてを選択する。attribute::name
は、文脈ノードのname
属性を選択する。attribute::*
は、文脈ノードの属性すべてを選択する。descendant::para
は、文脈ノードの子孫para
要素を選択する。ancestor::div
は、文脈ノードの祖先div
すべてを選択する。ancestor-or-self::div
は、文脈ノードの祖先div
、および文脈ノードがdiv
要素である場合にはその文脈ノードも、選択する。descendant-or-self::para
は、文脈ノードの子孫para
、および文脈ノードがpara
要素である場合にはその文脈ノードも、選択する。self::para
は、文脈ノードがpara
要素である場合には文脈ノードを選択し、そうでない場合には何も選択しない。child::chapter/descendant::para
は、文脈ノードの子chapter
要素の子孫para
要素を選択する。child::*/child::para
は、文脈ノードの孫para
すべてを選択する。/
は、文書ルート(これはつねに文書要素の親である。)を選択する。/descendant::para
は、文脈ノードと同じ文書にあるpara
要素すべてを選択する。/descendant::olist/child::item
は、文脈ノードと同じ文書にあるitem
要素で、親olist
をもつものすべてを選択する。child::para[position()=1]
は、文脈ノードの最初の子para
を選択する。child::para[position()=last()]
は、文脈ノードの最後の子para
を選択する。child::para[position()=last()-1]
は、文脈ノードの、最後から二番目の子para
を選択する。child::para[position()>1]
は、文脈ノードの最初の子para
以外の、文脈ノードの子para
すべてを選択する。following-sibling::chapter[position()=1]
は、文脈ノードの次の兄弟chapter
を選択する。preceding-sibling::chapter[position()=1]
は、文脈ノードの前の兄弟chapter
を選択する。/descendant::figure[position()=42]
は、文書の42番目のfigure
要素を選択する。/child::doc/child::chapter[position()=5]/child::section[position()=2]
は、doc
文書要素の5番目のchapter
の2番目のsection
を選択する。child::para[attribute::type="warning"]
は、文脈ノードの子para
で、type
属性にwarning
という値をとるものすべてを選択する。child::para[attribute::type='warning'][position()=5]
は、 文脈ノードの子para
でtype
属性にwarning
という値をとるうち5番目のものを選択する。child::para[position()=5][attribute::type="warning"]
は、文脈ノードの5番目の子para
がtype
属性にwarning
という値をとる場合に、その子para
を選択する。child::chapter[child::title='Introduction']
は、文脈ノードの子chapter
で、文字列値がIntroduction
に等しい子title
を1個以上もつものを選択する。child::chapter[child::title]
は、文脈ノードの子chapter
で、1個以上の子title
をもつものを選択する。child::*[self::chapter or self::appendix]
は、文脈ノードの子chapter
および子appendix
を選択する。child::*[self::chapter or self::appendix][position()=last()]
は、文脈ノードの子chapter
またはappendix
のうち最後のものを選択する。
ロケーションパスには2種類ある。相対ロケーションパスと絶対ロケーションパスとである。
相対ロケーションパスは、/
で区切られた1個以上のロケーションステップの連なりからなる。相対ロケーションパスの中にあるステップは、左から右に、ひとつに合成される。各ステップは順次、文脈ノードに対する相対関係において、ノードのセットを選択する。ステップの連なりの先頭部分は、以下のようにして、後続のステップと合成される。ステップの連なりの先頭部分が、文脈ノードに対する相対関係において、ノードのセットを選択する。そのセットの中にある各ノードが、次のステップの文脈ノードとして使われる。そのステップによって識別されたノードのセットが、1つに統合される。ステップを合成したものにより識別されるノードのセットとは、この統合体のことである。たとえば、child::div/child::para
は、文脈ノードの子 div
要素の子 para
要素、言い換えると、親 div
をもつ孫 para
要素を選択する。
絶対ロケーションパスは、/
に、随意、相対ロケーションパスが続いたものからなる。/
はそれ自体、文脈ノードを包含している文書のルートノードを選択する。それに相対ロケーションパスが続いている場合には、そのロケーションパスは、文脈ノードを包含している文書のルートノードに対する相対関係においてその相対ロケーションパスによって選択されることになるノードのセットを選択する。
ロケーションパス
| [1] | LocationPath | ::= | RelativeLocationPath | | | ----- | -------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------- | | | | | | | AbsoluteLocationPath | | | | [2] | AbsoluteLocationPath | ::= | '/' RelativeLocationPath? | | | | | | | AbbreviatedAbsoluteLocationPath | | | | [3] | RelativeLocationPath | ::= | Step | | | | | | | RelativeLocationPath '/' Step | | | | | | | | AbbreviatedRelativeLocationPath | | |
2.1 ロケーションステップ
ロケーションステップは、3つの部分をもつ。
- 軸。そのロケーションステップによって選択されるノードと文脈ノードとの間の樹関連性を指定するものである。
- ノードテスト。ノード型と、そのロケーションステップによって選択されるノードの展開名とを指定するものである。
- 0個以上の述部。任意の式を用いて、ロケーションステップによって選択されたノードのセットをさらに絞り込むものである。
ロケーションステップの文法は、軸名とノードテストとが二重コロンによって区切られたものに、それぞれ角括弧の中に囲まれた0個以上の式が続いたものである。たとえば、 child::para[position()=1]
では、child
が軸の名前であり、para
がノードテストであり、[position()=1]
が述部である。
ロケーションステップによって選択されるノードセットとは、軸とノードテストとから初期ノードセットを生成し、その後順次そのノードセットを述部のそれぞれによってフィルタリングした結果のノードセットである。
初期ノードセットには、文脈ノードに対して、軸によって指定された関連性を有し、かつノードテストによって指定されたノード型と展開名とを有するノードからなる。たとえば descendant::para
というロケーションステップは、文脈ノードの子孫 para
要素を選択する。descendant
は、初期ノードセットにある各ノードが文脈の子孫でなければならないことを指定する。para
は、初期ノードセットにある各ノードが para
という名前の要素でなければならないことを指定する。利用できる軸は[2.2 軸]で解説している。利用できるノードセットは[2.3 ノードテスト]で解説している。ノードテストの中には、意味が軸次第であるものもある。
初期ノードセットは、最初の述部によってフィルタリングされて、新しいノードセットを生成する。その後、この新しいノードセットが2番目の述部を用いてフィルタリングされ、としてゆく。最終的なノードセットが、そのロケーションステップによって選択されるノードセットである。軸は、各述部の式がどのように評価されるかに影響を及ぼし、よって述部の意味は軸との関係で定義される。[2.4 述部]を見よ。
ロケーションステップ
| [4] | Step | ::= | AxisSpecifier NodeTest Predicate* | | | ----- | ------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------- | | | | | | | AbbreviatedStep | | | | [5] | AxisSpecifier | ::= | AxisName '::' | | | | | | | AbbreviatedAxisSpecifier | | |
2.2 軸
以下の軸が利用可能である。
child
軸は、文脈ノードの子を包含する。descendant
軸は、文脈ノードの子孫を包含する。子孫とは、子、または子の子、としていったものであり、そのため descendant 軸が属性や名前空間ノードを包含することは決してない。parent
軸は、文脈ノードの親がある場合に、それを包含する。ancestor
軸は、文脈ノードの祖先を包含する。文脈ノードの祖先は、文脈ノードの親、その親の親、としていったものからなる。そのため、ancestor 軸は、文脈ノードがルートノードであるのでない限り、つねにルートノードを取り込むことになる。following-sibling
軸は、文脈ノードの後続の兄弟すべてを包含する。文脈ノードが属性ノードまたは名前空間ノードである場合には、following-sibling
軸は空である。preceding-sibling
軸は、文脈ノードの先行の兄弟すべてを包含する。文脈ノードが属性ノードまたは名前空間ノードである場合には、preceding-sibling
軸は空である。following
軸は、子孫を除き、属性ノードや名前空間ノードを除いて、文脈ノードと同じ文書の中にあり、文書順においてその文脈ノードの後にあるすべてのノードを包含する。preceding
軸は、祖先を除き、属性ノードや名前空間ノードを除いて、文脈ノードと同じ文書にあり、文書順においてその文脈ノードの前にあるすべてのノードを選択する。attribute
軸は、文脈ノードの属性を包含する。文脈ノードが要素であるのでない限り、軸は空ということになる。namespace
軸は、文脈ノードの名前空間ノードを包含する。文脈ノードが要素であるのでない限り、軸は空ということになる。self
軸は、文脈ノード自身のみを包含する。descendant-or-self
軸は、文脈ノード、および文脈ノードの子孫を包含する。ancestor-or-self
軸は、文脈ノード、および文脈ノードの祖先を包含する。そのため、ancestor 軸はつねにルートノードを取り込むことになる。
註:
ancestor
,descendant
,following
,preceding
,self
軸は、(属性や名前空間ノードを無視すると)1個の文書を分割する。これらは重なり合わず、一緒になってその文書の中にあるノードすべてを包含するのである。
軸
| [6] | AxisName | ::= | 'ancestor' | | | ----- | -------- | ----------------------- | ---------- | | | | | | | 'ancestor-or-self' | | | | | | | | 'attribute' | | | | | | | | 'child' | | | | | | | | 'descendant' | | | | | | | | 'descendant-or-self' | | | | | | | | 'following' | | | | | | | | 'following-sibling' | | | | | | | | 'namespace' | | | | | | | | 'parent' | | | | | | | | 'preceding' | | | | | | | | 'preceding-sibling' | | | | | | | | 'self' | | |
2.3 ノードテスト
どの軸にも主ノード型がある。軸がある要素を包含している場合、主ノード型は element である。それ以外の場合には、主ノード型は、その軸が包含できるノードの型である。そこで、
- attribute 軸については、主ノード型は attribute である。
- namespace 軸については、主ノード型は namespace である。
- その他の軸については、主ノード型は element である。
QName であるノードテストは、そのノードの型([5 データモデル]を見よ。)が主ノード型であり、かつ QName によって指定される展開名に等しい展開名を有する場合には、かつ有する場合にのみ、真である。たとえば、child::para
は、文脈ノードの子 para
要素を選択する。文脈ノードが子 para
をもたない場合には、これは空のノードセットを選択することになる。attribute::href
は、文脈ノードの href
属性を選択する。文脈ノードが href
属性をとらない場合には、これは空のノードセットを選択することになる。
ノードテストの QName は、式文脈からの名前空間宣言を用いて展開名に展開される。これは、xmlns
で宣言されたデフォルト名前空間が利用されないという異を除き、開始タグおよび終了タグの要素型について展開がなされるのと同じ方法である。QName がプリフィックスをとらない場合、名前空間URIはヌルである(これは属性名が展開されるのと同じ方法である)。QNameが、式文脈の中に名前空間宣言がないプリフィックスをとる場合は、エラーである。
*
というノードテストは、主ノード型の任意のノードについて真である。たとえば、child::*
は、文脈ノードの子要素すべてを選択することになり、attribute::*
は、文脈ノードの属性すべてを選択することになる。
ノードテストは NCName:*
という形式をとることができる。この場合には、プリフィックスは、文脈名前空間宣言を用いて、QName によるのと同じ方法で展開される。式文脈の中にそのプリフィックスについての名前空間宣言がない場合は、エラーである。ノードテストは、名前のローカル部分とは無関係に、展開名がプリフィックスの展開先である名前空間URIをもつ主ノード型の任意のノードについて真である。
text()
というノードテストは、任意のテキストノードについて真である。たとえば、child::text()
は、文脈ノードの子テキストノードを選択することになる。同様に、comment()
というノードテストは任意の注釈ノードについて真であり、processing-instruction()
というノードテストは任意の処理命令について真である。processing-instruction()
テストは、Literal である引数を1個とることがある。この場合には、その Literal の値に等しい名前をもつ任意の処理命令について真である。
node()
というノードテストは、どのようなものであろうと任意の型の任意のノードにつき真である。
| [7] | NodeTest | ::= | NameTest | | | ----- | -------- | ---------------------------------------------------------- | ------------------------ | | | | | | | NodeType '(' ')' | | | | | | | | 'processing-instruction' '(' Literal ')' | | |
2.4 述部
軸は、順行軸と逆行軸とのいずれかである。文脈ノード、または文書順において文脈ノードの後にあるノードしか包含しない軸は、順行軸である。文脈ノード、または文書順において文脈ノードの前にあるノードしか包含しない軸は、逆行軸である。そこで、ancestor, ancestor-or-self, preceding, preceding-sibling 軸は逆行軸である。その他の軸はすべて順行軸である。self 軸は、いつでも最大で1個のノードを包含するものであるから、順行軸であろうと逆行軸であろうと違いはない。 軸に対する関係におけるそのノードのメンバーの近接ポジションは、軸が順行軸である場合には文書順に、軸が逆行軸である場合には逆文書順に並べられたノードセットにおけるそのノードのポジションであると定義される。最初のポジションは 1 である。
述部は、軸に対する関係においてノードセットをフィルタリングして、新しいノードセットを作り出す。フィルタリングされるべきノードセットのノードごとに、そのノードを文脈ノードとし、ノードセット内のノードの数を文脈サイズとし、軸に対する関係においてそのノードセットにおけるそのノードの近接ポジションを文脈ポジションとして、PredicateExpr が評価される。PredicateExpr がそのノードについて真と評価される場合には、そのノードは新しいノードセットに組み込まれる。そうでない場合には組み込まれない。
PredicateExpr は、Expr を評価し、結果をブール値に変換することにより評価される。結果が数値である場合には、結果は、その数値が文脈ポジションに等しいときには真に変換され、そうでないときには偽に変換される。結果が数値でない場合には、結果はあたかも boolean 関数を呼び出したかのように変換されることになる。そこで para[3]
というロケーションパスは para[position()=3]
と等価である。
述部
| [8] | Predicate | ::= | '[' PredicateExpr ']' | | | ----- | ------------- | --- | -------------------------------------------- | | | [9] | PredicateExpr | ::= | Expr | |
2.5 省略文法
こちらは、省略文法を用いたロケーションパスの例である。
para
は、文脈ノードの子para
要素を選択する。*
は、文脈ノードの子要素すべてを選択する。text()
は、文脈ノードの子テキストノードすべてを選択する。@name
は、文脈ノードのname
属性を選択する。@*
は、文脈ノードの属性すべてを選択する。para[1]
は、文脈ノードの1番目の子para
を選択する。para[last()]
は、文脈ノードの最後の子para
を選択する。*/para
は、文脈ノードの孫para
すべてを選択する。/doc/chapter[5]/section[2]
は、doc
の5番目のchapter
の2番目のsection
を選択する。chapter//para
は、文脈ノードの子chapter
要素の子孫para
要素を選択する。//para
は、文書ルートの子孫para
すべてを選択し、よって文脈ノードと同じ文書にあるpara
要素すべてを選択する。//olist/item
は、文脈ノードと同じ文書にあるitem
要素で、親olist
をもつものすべてを選択する。.
は、文脈ノードを選択する。.//para
は、文脈ノードの子孫para
要素を選択する。..
は、文脈ノードの親を選択する。../@lang
は、文脈ノードの親のlang
属性を選択する。para[@type="warning"]
は、文脈ノードの子para
のうちtype
属性にwarning
という値をとるものすべてを選択する。para[@type="warning"][5]
は、文脈ノードの子para
で、type
属性にwarning
という値をとるもののうち5番目のものを選択する。para[5][@type="warning"]
は、文脈ノードの5番目の子para
がtype
属性にwarning
という値をとる場合に、それを選択する。chapter[title="Introduction"]
は、文脈ノードの子chapter
で、文字列値がIntroduction
に等しい子title
を1個以上もつものを選択する。chapter[title]
は、文脈ノードの子chapter
で、子title
を1個以上もつものを選択する。employee[@secretary and @assistant]
は、文脈ノードの子employee
で、secretary
属性とassistant
属性との両方をもつものすべてを選択する。
最も重要な省略は、child::
をロケーションステップから省略できるということである。実効的には、child
はデフォルト軸である。たとえば、div/para
というロケーションパスは、child::div/child::para
の短縮形である。
属性についても省略形がある。attribute::
は @
と省略できる。たとえば、para[@type="warning"]
というロケーションパスは child::para[attribute::type="warning"]
の短縮形であり、type
属性に warning
と等しい値をとる子 para
を選択する。
//
は /descendant-or-self::node()/
の短縮形である。たとえば、//para
は /descendant-or-self::node()/child::para
の短縮形であり、文書内の任意の para
要素を選択することになる(文書要素ノードはルートノードの子であるから、文書要素である para
要素であっても //para
によって選択されることになる)。div//para
は div/descendant-or-self::node()/child::para
の短縮形であり、子 div
の子孫 para
すべてを選択することになる。
註:
//para[1]
というロケーションパスは、/descendant::para[1]
というロケーションパスと同じ意味_ではない_。後者は、最初の子孫para
要素を選択する。前者は、その親の1番目の子para
である子孫para
要素すべてを選択する。
.
というロケーションステップは self::node()
の短縮形である。これは特に //
と結びつけると役に立つ。たとえば、.//para
というロケーションパスは
self::node()/descendant-or-self::node()/child::para
の短縮形であり、文脈ノードの子孫 para
要素すべてを選択することになる。
同様に、..
というロケーションステップは parent::node()
の短縮形である。たとえば、../title
は parent::node()/child::title
の短縮形であり、文脈ノードの親の子 title
を選択することになる。
省略形
| [10] | AbbreviatedAbsoluteLocationPath | ::= | '//' RelativeLocationPath | | | ------ | ------------------------------- | ------- | ---------------------------------------------------------------------- | | | [11] | AbbreviatedRelativeLocationPath | ::= | RelativeLocationPath '//' Step | | | [12] | AbbreviatedStep | ::= | '.' | | | | | | | '..' | | | | [13] | AbbreviatedAxisSpecifier | ::= | '@'? | |
3 式
3.1 基本事項
VariableReference は、文脈内の変数バインディングのセットにおいてその変数名が結びつけられている先の値へと評価される。変数名が、式文脈内の変数バインディングのセットにあるどの値にも結びつけられて異な場合には、エラーである。
グループ化のために括弧を用いてもかまわない。
| [14] | Expr | ::= | OrExpr | | | ------ | ----------- | ----------------------------------- | ------------------------------------------ | | | [15] | PrimaryExpr | ::= | VariableReference | | | | | | | '(' Expr ')' | | | | | | | | Literal | | | | | | | | Number | | | | | | | | FunctionCall | | |
3.2 関数呼び出し
FunctionCall 式は、FunctionName を使って式評価文脈関数ライブラリにある関数を特定し、Argument (引数)のそれぞれを評価し、その関数によって要求されている型に各引数を変換し、最後に関数を呼び出してそれに変換済み引数を渡すことにより評価される。引数の数が誤っているか、要求されている型に引数を変換できない場合には、エラーである。FunctionCall 式の結果は、関数によって返された結果である。
引数は、文字列型へは、**string** 関数を呼び出したかのように変換される。数値型へは、**number** 関数を呼び出したかのように変換される。ブール値型へは、**boolean** 関数を呼び打高のように変換される。ノードセット型のノードである引数は、ノードセットに変換することができない。
| [16] | FunctionCall | ::= | FunctionName '(' ( Argument ( ',' Argument )* )? ')' | | | ------ | ------------ | --- | --------------------------------------------------------------------------------------------------------- | | | [17] | Argument | ::= | Expr | |
3.3 ノードセット
ロケーションパスは、式として使うことができる。式は、そのパスによって選択されるノードのセットを返す。
|
演算子は、そのオペランド(被演算数)の和集合を計算する。オペランドはノードセットでなければならない。
Predicate (述部)は、ロケーションパスで使われているのと同じ方法で、式を評価するために使われる。フィルタリングされるべき式がノードセットに評価されない場合は、エラーである。Predicate は、child 軸に対する関係において、ノードセットをフィルタリングする。
註: Predicate の意味は、どの軸が適用されるかにより決定的に左右される。たとえば、
preceding::foo[1]
は、[1]
という述部に適用される軸が preceding 軸であるから、逆文書順 における1番目のfoo
要素を返す。対照的に、(preceding::foo)[1]
は、[1]
という述部に適用される軸が child 軸であるから、文書順 における1番目のfoo
要素を返すのである。
/
演算子および //
演算子は、式や相対ロケーションパスを合成する。式がノードセットに評価されない場合は、エラーである。/
演算子は、/
がロケーションパスの中で使われるときと同じようにして合成を行う。ロケーションパスにおけるのと同様、//
は /decendant-or-self::node()
の短縮形である。
ノードセットに変換できるオブジェクトの型はない。
| [18] | UnionExpr | ::= | PathExpr | | | ------ | ---------- | ------------------------------------------------------------------------------------- | -------------------------------- | | | | | | | UnionExpr '|' PathExpr | | | | [19] | PathExpr | ::= | LocationPath | | | | | | | FilterExpr | | | | | | | | FilterExpr '/' RelativeLocationPath | | | | | | | | FilterExpr '//' RelativeLocationPath | | | | [20] | FilterExpr | ::= | PrimaryExpr | | | | | | | FilterExpr Predicate | | |
3.4 ブール値
boolean 型のオブジェクトは、真と偽という2つの値のうち1つをとることができる。
or
式は、各オペランドを評価し、その値を boolean 関数を呼び出したかのようにしてブール値に変換することにより評価される。結果は、どちらかの値が真である場合には真であり、それ以外の場合には偽である。左オペランドが真と評価される場合には、右オペランドは評価されない。
and
式は、各オペランドを評価し、その値を boolean 関数を呼び出したかのようにしてブール値に変換することにより評価される。結果は、両方の値が真である場合には真であり、それ以外の場合には偽である。左オペランドが偽と評価される場合には、右オペランドは評価されない。
EqualityExpr (単なる RelationalExpr ではない。)または RelationalExpr (単なる AdditiveExpr ではない)は、2つのオペランドを評価した結果のオブジェクトを比較することにより評価される。結果オブジェクトの比較は、以下の3段落において定義される。第一に、ノードセットを含んだ比較は、ノードセットを含まない比較を用いて定義される。これは、=
, !=
, <=
, <
, >=
, >
について、統一的に定義される。第二に、ノードセットを含まない比較が、=
, !=
について定義される。第三に、ノードセットを含まない比較が、<=
, <
, >=
, >
について定義される。
比較されるべきオブジェクトの双方がノードセットである場合、比較は、2つのノードの文字列値について比較を実行した結果が真であるようなノードが、1つ目のノードセットと2つ目のノードセットとにある場合に、かつある場合にのみ、真ということになる。比較されるべきオブジェクトの一方がノードセットであり、他方が数値である場合、比較は、比較されるべき数値と、**number** 関数を用いてノードの文字列値を数値に変換した結果とについて比較を実行した結果が真であるようなノードが、ノードセットの中にある場合に、かつある場合にのみ、真ということになる。比較されるべきオブジェクトの一方がノードセットであり、他方が文字列である場合、比較は、ノードの文字列値と他方の文字列とについて比較を実行した結果が真であるようなノードが、ノードセットの中にある場合に、かつある場合にのみ、真ということになる。比較されるべきオブジェクトの一方がノードセットであり、他方がブール値である場合、比較は、ブール値と、**boolean** 関数を用いてノードセットをブール値に変換した結果とについて比較を実行した結果が真である場合に、かつ真である場合にのみ、真ということになる。
比較されるべきオブジェクトの中にノードセットがなく、演算子が =
または !=
である場合、オブジェクトは、以下のようにしてオブジェクトを共通の型に変換してから比較することにより、比較される。比較されるべきオブジェクトのうち少なくとも1個がブール値である場合、比較されるべきオブジェクトはそれぞれ boolean 関数を適用したかのようにしてブール値に変換される。それ以外の場合で、比較されるべきオブジェクトのうち少なくとも1個が数値であるときには、比較されるべきオブジェクトはそれぞれ number 関数を適用したかのようにして数値に変換される。それ以外のときは、比較されるべきオブジェクトはともに string 関数を適用したかのようにして文字列に変換される。=
比較は、オブジェクトが等しい場合に、かつ等しい場合にのみ、真ということになる。!=
比較は、オブジェクトが等しくない場合に、かつ等しくない場合にのみ、真ということになる。数値は、IEEE 754 [IEEE 754] に従って相等性を比較される。2個のブール値は、双方が真であるか双方が偽である場合に等しい。2個の文字列は、同じUCSキャラクタの連なりからなる場合に、かつなる場合にのみ、等しい。
註:
$x
がノードセットに結合されている場合、$x="foo"
はnot($x!="foo")
と同じ意味ではない。前者は、$x
にある_何らかの_ノードがfoo
という文字列値をもつ場合に、かつもつ場合にのみ、真である。後者は、$x
にある_すべての_ノードがfoo
という文字列値をもつ場合に、かつもつ場合にのみ、真である。
比較されるべきオブジェクトにノードセットであるものがなく、かつ演算子が <=
, <
, >=
, >
である場合、オブジェクトは、両方のオブジェクトを数値に変換し、その数値を IEEE 754 に従って比較することにより、比較される。<
比較は、1つ目の数値が2つ目の数値よりも小さい場合に、かつ小さい場合にのみ、真ということになる。<=
比較は、1つ目の数値が2つ目の数値よりも小さいか等しい場合に、かつ小さいか等しい場合にのみ、真ということになる。>
比較は、1つ目の数値が2つ目の数値よりも大きい場合に、かつ大きい場合にのみ、真ということになる。>=
比較は、1つ目の数値が2つ目の数値よりも大きいか等しい場合に、かつ大きいか等しい場合にのみ、真ということになる。
註: XPath式がXML文書の中に出現するとき、どの
<
演算子および<=
演算子も、XML 1.0 規則に従い、たとえば<
や<=
を用いてクオートされなければならない。以下の例では、test
属性の値がXPath式である。<xsl:if test="@value < 10">...
| [21] | OrExpr | ::= | AndExpr | | | ------ | -------------- | ----------------------------------------------------------------------------- | ------------------------------------ | | | | | | | OrExpr 'or' AndExpr | | | | [22] | AndExpr | ::= | EqualityExpr | | | | | | | AndExpr 'and' EqualityExpr | | | | [23] | EqualityExpr | ::= | RelationalExpr | | | | | | | EqualityExpr '=' RelationalExpr | | | | | | | | EqualityExpr '!=' RelationalExpr | | | | [24] | RelationalExpr | ::= | AdditiveExpr | | | | | | | RelationalExpr '<' AdditiveExpr | | | | | | | | RelationalExpr '>' AdditiveExpr | | | | | | | | RelationalExpr '<=' AdditiveExpr | | | | | | | | RelationalExpr '>=' AdditiveExpr | | |
註: 上記の文法の効果は、優先順位が(低いものから)
or
and
=
,!=
<=
,<
,>=
,>
であり、演算子はすべて左連結であるということにある。たとえば、3 > 2 > 1
は(3 > 2) > 1
と等価であり、偽と評価される。
3.5 数値
数値は、浮動小数点数を表す。数値は、任意の倍精度64ビットフォーマット IEEE 754 値[IEEE 754]をとることができる。これには、特殊な「非数値」(NaN)値や、正および負の無限大、正および負のゼロが含まれる。IEEE 754 規格の鍵となる規則のまとめは、[JLS] の Section 4.2.3 を見ること。
数的演算子は、オペランドを、**number** 関数を呼び出したかのようにして、数値に変換する。
+
演算子は、加算を実行する。
-
演算子は、減算を実行する。
註: XMLは名前の中に
-
を許容しているから、-
演算子は概して空白が前に来る必要がある。たとえば、foo-bar
は、foo-bar
という名前の子要素を包含するノードセットと評価される。foo - bar
は、1番目のfoo
子要素の文字列値を数値に変換した結果と、1番目のbar
子要素の文字列値を数値に変換した結果との差と評価される。
div
演算子は、IEEE 754 に従った浮動小数点除算を実行する。
mod
演算子は、打ち切り除算の剰余を返す。たとえば、
5 mod 2
は1
を返す。5 mod -2
は1
を返す。-5 mod 2
は-1
を返す。-5 mod -2
は-1
を返す。
註: これは、JavaやECMAScriptの
%
演算子と同じものである。
註: これは IEEE 754 剰余演算子と同じものではない。IEEE 754 剰余演算子は、丸め除算の剰余を返すものである。
数式
| [25] | AdditiveExpr | ::= | MultiplicativeExpr | | | ------ | ------------------ | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | | | | | | | AdditiveExpr '+' MultiplicativeExpr | | | | | | | | AdditiveExpr '-' MultiplicativeExpr | | | | [26] | MultiplicativeExpr | ::= | UnaryExpr | | | | | | | MultiplicativeExpr MultiplyOperator UnaryExpr | | | | | | | | MultiplicativeExpr 'div' UnaryExpr | | | | | | | | MultiplicativeExpr 'mod' UnaryExpr | | | | [27] | UnaryExpr | ::= | UnionExpr | | | | | | | '-' UnaryExpr | | |
3.6 文字列
文字列は0個以上のキャラクタの連なりからなる。ここでキャラクタはXML勧告[XML]と同様に定義される。そのため、XPathにおける1個のキャラクタは、1個の対応するUnicodeスカラー値をもつ1個のUnicode抽象キャラクタに対応する([Unicode]を見よ)。これは、16ビットUnicodeコード値と同じものではない。U+FFFF より大きいUnicodeスカラー値をもつ抽象キャラクタのUnicodeコード化キャラクタ表現は、16ビットUnicodeコード値の対(サロゲートペア)となる。多くのプログラミング言語では、文字列は、16ビットUnicodeコード値の連なりによって表現される。そうした言語でXPathを実装するには、サロゲートペアが単一のXPathキャラクタとして正しく扱われることが保証されるよう注意しなければならない。
註: Unicodeにおいては、別のUnicode抽象キャラクタの連なりからなるにもかかわらず同一のものとして扱われるべき2つの文字列が存在しうる。たとえば、アクセントつきキャラクタは、合成済み形式でも分解形式でも表現されることがある。したがって、XPath式のキャラクタとXML文書のキャラクタとの両方が正典的形式に普通化されているのでない限り、XPath式が予期しない結果を返すことがある。[Character Model]を見よ。
3.7 レキシカルな構造
トークン化の際、つねに可能な中で最長のトークンが返される。
読みやすくするため、文法によって明示的に許されていなくとも、式の中で空白を使ってかまわない。ExprWhitespace は、任意の ExprToken の前または後のパターンの中に自由に追加してかまわない。
ExprToken 文法の曖昧さをなくすため、以下の特別なトークン化規則が、規定された順序に適用されなければならない。
- 先行トークンがあり、その先行トークンが
@
,::
,(
,[
,,
のうちの1つ、または Operator (演算子)でない場合、*
は MultiplyOperator として認識されなければならず、NCName は OperatorName として認識されなければならない。 - (おそらく間に ExprWhitespace を挟んだ後) NCName に続くキャラクタが
(
である場合、トークンは、NodeType または FunctionName として認識されなければならない。 - (おそらく間に ExprWhitespace を挟んだ後) NCName に続く2個のキャラクタが
::
である場合、トークンは AxisName として解釈されなければならない。 - それ以外の場合、トークンは MultiplyOperator か OperatorName, NodeType, FunctionName, AxisName として認識されなければならない。
式レキシカルな構造物
| [28] | ExprToken | ::= | '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::' | | | | | ------ | ----------------- | ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------- | ----- | ----- | --- | ---- | ---- | --- | ---- | --- | ---- | | | | | | | NameTest | | | | | | | | | | | | | | | | | NodeType | | | | | | | | | | | | | | | | | Operator | | | | | | | | | | | | | | | | | FunctionName | | | | | | | | | | | | | | | | | AxisName | | | | | | | | | | | | | | | | | Literal | | | | | | | | | | | | | | | | | Number | | | | | | | | | | | | | | | | | VariableReference | | | | | | | | | | | | | [29] | Literal | ::= | '"' [^"]* '"' | | | | | | | | | | | | | | | | "'" [^']* "'" | | | | | | | | | | | | | [30] | Number | ::= | Digits ('.' Digits?)? | | | | | | | | | | | | | | | | '.' Digits | | | | | | | | | | | | | [31] | Digits | ::= | [0-9]+ | | | | | | | | | | | | [32] | Operator | ::= | OperatorName | | | | | | | | | | | | | | | | MultiplyOperator | | | | | | | | | | | | | | | | | '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>=' | | | [33] | OperatorName | ::= | 'and' | 'or' | 'mod' | 'div' | | | | | | | | | | [34] | MultiplyOperator | ::= | '*' | | | | | | | | | | | | [35] | FunctionName | ::= | QName - NodeType | | | | | | | | | | | | [36] | VariableReference | ::= | '$' QName | | | | | | | | | | | | [37] | NameTest | ::= | '*' | | | | | | | | | | | | | | | | NCName ':' '*' | | | | | | | | | | | | | | | | | QName | | | | | | | | | | | | | [38] | NodeType | ::= | 'comment' | | | | | | | | | | | | | | | | 'text' | | | | | | | | | | | | | | | | | 'processing-instruction' | | | | | | | | | | | | | | | | | 'node' | | | | | | | | | | | | | [39] | ExprWhitespace | ::= | S | | | | | | | | | | |
4 コア関数ライブラリ
この節は、XPath実装物が、式を評価するのに用いる関数ライブラリにつねに組み込まなければならない関数を説明したものである。
関数ライブラリの関数はそれぞれ、関数プロトタイプを用いて規定されている。これは、返り値の型、関数名、引数の型を与えるものである。引数型に疑問符が続いている場合、その引数は任意的である。それ以外の場合、引数は必須である。
4.1 ノードセット関数
関数: number last()
last 関数は、式評価文脈の文脈サイズに等しい数値を返す。
関数: number position()
position 関数は、式評価文脈の文脈ポジションに等しい数値を返す。
関数: number count(node-set)
count 関数は、引数 node-set のノード数を返す。
関数: node-set id(object)
id 関数は、その一意的IDによって要素を選択する([5.2.1 一意的ID]を見よ)。**id** への引数が node-set 型である場合、結果は、引数 node-set のノードのそれぞれの文字列値に id を適用した結果の和集合である。**id** への引数がその他の型である場合、引数は、**string** 関数を呼び出したかのようにして、文字列に変換される。文字列は、空白で切り分けられたトークンのリストに分割される(空白とは生成規則 S に合致する任意のキャラクタ列である)。結果は、文脈ノードと同じ文書の中にある要素で、リスト内のトークンのどれかに等しい一意的IDをもつものを包含したノードセットである。
id("foo")
は、foo
という一意的IDをもつ要素を選択する。id("foo")/child::para[position()=5]
は、foo
という一意的IDをもつ要素の5番目の子para
を選択する。
関数: string local-name(node-set?)
local-name 関数は、引数 node-set のノードのうち文書順において最初のものの展開名のローカル部分を返す。引数 node-set が空である場合や、最初のノードが展開名をもたない場合には、空文字列が返される。引数が省略された場合、文脈ノードを唯一のメンバーとするノードセットがデフォルトとされる。
関数: string namespace-uri(node-set?)
namespace-uri 関数は、引数 node-set のノードのうち文書順において最初のものの展開名の名前空間URIを返す。引数 node-set が空である場合や、最初のノードが展開名をもたない場合、展開名の名前空間URIがヌルである場合には、空文字列が返される。引数が省略された場合、文脈ノードを唯一のメンバーとするノードセットがデフォルトとされる。
註: namespace-uri 関数によって返される文字列は、要素ノードや属性ノード以外については、空ということになる。
関数: string name(node-set?)
name 関数は、引数 node-set のノードのうち文書順において最初のものの展開名を表す QName を包含する文字列を返す。QName は、展開名が表されているノードについて効力を有する名前空間宣言に関して展開名を表すものでなければならない。これはXMLソースの中に出現した QName であるのが典型であろう。ノードについて効力を有する名前空間宣言で、同じ名前空間に複数のプリフィックスを結びつけるものがある場合には、こうである必要はない。もっとも、実装物は、元のプリフィックスについての情報をそのノードの表現に組み込んでもかまわない。この場合、実装物は、返された文字列がXMLソースで使われている QName とつねに同じものであることを保証することができる。引数 node-set が空である場合や、最初のノードが展開名をもたない場合には、空文字列が返される。引数が省略された場合、文脈ノードを唯一のメンバーとするノードセットがデフォルトとされる。
註: name 関数によって返される文字列は、要素ノードや属性ノードを除き、**local-name** によって返される文字列と同じということになる。
4.2 文字列関数
関数: string string(object?)
string 関数は、以下のようにして、オブジェクトを文字列に変換する。
- ノードセットは、ノードセットのノードのうち文書順において最初のものの文字列値を返すことにより、文字列に変換される。ノードセットが空である場合、空文字列が返される。
- 数値は、以下のようにして、文字列に変換される。
- NaNは
NaN
という文字列に変換される。 - 正ゼロは
0
という文字列に変換される。 - 負ゼロは
0
という文字列に変換される。 - 正の無限大は
Infinity
という文字列に変換される。 - 負の無限大は
-Infinity
という文字列に変換される。 - 数値が整数である場合、数値は十進法形式で、小数点がなく先頭のゼロもない Number として表現され、数値が負である場合には負号 (
-
) が前につく。 - それ以外の場合、数値は十進形式で、小数点と、小数点の前に少なくとも1個の数字がつき、小数点の後に少なくとも1個の数字がついたものを含んだ Number として表現され、数値が負である場合には負号 (
-
) が前につく。小数点の直前にある必須の数字1個を別として、小数点の前に先頭のゼロがあってはならない。小数点の後の必須の数字1個を越えてそれ以上の数字は、その数値をその他すべての IEEE 754 数値から一意的に区別するのに必要な数字がなければならないが、必要なだけしかあってはならない。
- NaNは
- ブール値の偽は
false
という文字列に変換される。ブール値の真はtrue
という文字列に変換される。 - 四基本形以外の型のオブジェクトは、その型ごとの方法で文字列に変換される。
引数が省略された場合、文脈ノードを唯一のメンバーとするノードセットがデフォルトとされる。
註:
string
関数は、ユーザに対する表現のために数値を文字列に変換しようとするものではない。この機能は、[XSLT]のformat-number
関数とxsl:number
要素とが用意する。
関数: string concat(string, string, string*)
concat 関数は、引数を結合したものを返す。
関数: boolean starts-with(string, string)
starts-with 関数は、1つ目の引数 string が2つ目の引数 string で始まる場合には真を返し、それ以外の場合には偽を返す。
関数: boolean contains(string, string)
contains 関数は、1つ目の引数 string が2つ目の引数 string を包含している場合には真を返し、それ以外の場合には偽を返す。
関数: string substring-before(string, string)
substring-before 関数は、1つ目の引数 string の中で2つ目の引数 string が最初に出現する箇所の前に来る、1つ目の引数 string の部分文字列を返す。1つ目の引数 string が2つ目の引数 string を包含しない場合には、空文字列を返す。たとえば、 substring-before("1999/04/01","/")
は 1999
を返す。
関数: string substring-after(string, string)
substring-after 関数は、1つ目の引数 string の中で2つ目の引数 string が最初に出現する箇所の後に来る、1つ目の引数 string の部分文字列を返す。1つ目の引数 string が2つ目の引数 string を包含しない場合には、空文字列を返す。たとえば、 substring-after("1999/04/01","/")
は 04/01
を返し、substring-after("1999/04/01","19")
は 99/04/01
を返す。
関数: string substring(string, number, number?)
substring 関数は、2つ目の引数で指定された箇所で始まり、3つ目の引数で指定された長さをもつ、1つ目の引数の部分文字列を返す。たとえば、substring("12345",2,3)
は "234"
を返す。3つ目の引数が指定されない場合には、2つ目の引数で指定された箇所で始まり、文字列の末尾まで続く部分文字列を返す。たとえば、substring("12345",2)
は "2345"
を返す。
より厳密にいうと、文字列([3.6 文字列]を見よ。)の中にあるキャラクタはそれぞれ、数値で示されるポジションをもつものとみなされる。1番目のキャラクタのポジションは 1 であり、2番目のキャラクタのポジションは 2 であり、などとなっている。
註: これはJavaやECMAScriptとは異なっている。JavaやECMAScriptでは、
String.substring
メソッドは、最初のキャラクタのポジションを 0 として扱う。
返される部分文字列は、キャラクタのポジションが、2つ目の引数の丸め値より大きいか等しく、かつ、3つ目の引数が指定されている場合には、2つ目の引数の丸め値と3つ目の引数の丸め値との和よりも小さいキャラクタを包含する。上記で用いられる比較や加算は、標準である IEEE 754 規則に従う。丸めは、**round** 関数を呼び出したかのようにして、実行される。以下の例は、さまざまな変わったケースを図解したものである。
substring("12345", 1.5, 2.6)
は"234"
を返す。substring("12345", 0, 3)
は"12"
を返す。substring("12345", 0 div 0, 3)
は""
を返す。substring("12345", 1, 0 div 0)
は""
を返す。substring("12345", -42, 1 div 0)
は"12345"
を返す。substring("12345", -1 div 0, 1 div 0)
は""
を返す。
関数: number string-length(string?)
string-length は、string ([3.6 文字列]を見よ。)にあるキャラクタの数を返す。引数が省略された場合には、文脈ノードを文字列に変換したもの、言い換えると、文脈ノードの文字列値がデフォルトとされる。
関数: string normalize-space(string?)
normalize-space 関数は、引数 string を、先頭および末尾の空白を除去し、空白キャラクタが連なった部分をスペース1個で置き換えることにより普通化して返す。空白キャラクタとは、XMLの S 生成規則によって認められているものと同じである。引数が省略された場合には、文脈ノードを文字列に変換したもの、言い換えると、文脈ノードの文字列値がデフォルトとされる。
関数: string translate(string, string, string)
translate 関数は、1つ目の引数 string を、2つ目の引数 string の中にあるキャラクタが出現する箇所を、3つ目の引数 string の中で対応する位置にあるキャラクタで置き換えて返す。たとえば、 translate("bar","abc","ABC")
は BAr
という文字列を返す。(2つ目の引数 string が3つ目の引数 string よりも長いために)2つ目の引数 string の中のキャラクタで、3つ目の引数 string の中で対応する位置にキャラクタがないものがある場合には、そのキャラクタが1つ目の引数 string の中で出現する箇所は除去される。たとえば、translate("--aaa--","abc-","ABC")
は "AAA"
を返す。2つ目の引数 string の中で2回以上出現するキャラクタがある場合、最初に出現するものが置換キャラクタを決定する。3つ目の引数 string が2つ目の引数 string よりも長い場合、余分なキャラクタは無視される。
註: translate 関数は、すべての言語における大文字小文字の変換について十分な解決策であるというわけではない。将来のバージョンのXPathは、大文字小文字の変換のために追加的な関数を用意するかもしれない。
4.3 ブール値関数
関数: boolean boolean(object)
boolean 関数は、引数を以下のようにしてブール値に変換する。
- 数値は、正または負のゼロでなくNaNでもない場合に、かつない場合にのみ、真である。
- ノードセットは、非空である場合に、かつ非空である場合にのみ、真である。
- 文字列は、その長さが非ゼロである場合に、かつ非ゼロである場合にのみ、真である。
- 四基本形以外の型のオブジェクトは、その型ごとの方法でブール値に変換される。
関数: boolean not(boolean)
not 関数は、引数が偽である場合に真を返し、そうでない場合には偽を返す。
関数: boolean true()
true 関数は、真を返す。
関数: boolean false()
false 関数は、偽を返す。
関数: boolean lang(string)
lang 関数は、xml:lang
属性によって指定されている文脈ノードの言語が、引数 string によって指定される言語と同じ、あるいはその下位言語であるかどうかにより、真または偽を返す。文脈ノードの言語は、文脈ノードの xml:lang
属性、または文脈ノードに xml:lang
属性がない場合には、文脈ノードの、xml:lang
属性をもつ直近の祖先の値によって決定される。そうした属性がない場合、**lang** は偽を返す。そうした属性がある場合、大文字小文字の区別を無視して属性値が引数と等しいか、あるいは、大文字小文字の区別を無視し、属性値の接尾辞を無視して、属性値が引数と等しいような -
で始まる接尾辞があるとき、**lang** は真を返す。たとえば、lang("en")
は、文脈ノードがこれら5つの要素のうちのどれであっても、真を返すことになる。
4.4 数値関数
関数: number number(object?)
number 関数は、引数を以下のようにして数値に変換する。
- オプションの空白にオプションの負号1個が続き、Number が続いて空白が続いたものからなる文字列は、その文字列が表す数学的値に(IEEE 754 最近接値丸めルールに従い)最も近い IEEE 754 数値に変換される。その他の文字列はどれもNaNに変換される。
- ブール値の真は 1 に変換される。ブール値の偽は 0 に変換される。
- ノードセットは、まず string 関数を呼び出したかのようにして文字列に変換され、その後文字列引数とと同じようにして変換される。
- 四基本形以外の型のオブジェクトは、その型ごとの方法で数値に変換される。
引数が省略された場合、文脈ノードを唯一のメンバーとするノードセットがデフォルトとされる。
註: number 関数は、その要素が言語中立的な書式(これは、ユーザに対する表現のために言語特定の書式に変形されるのが典型であろう。)で数的データを表現する型のものであるのでない限り、XML文書の要素の中に出現する数的データの変形に用いるべきではない。(ユーザに対する表現のために言語特定の書式に変形されるのが典型であろう。) さらに、**number** 関数は、その要素によって用いられている言語中立的な書式が Number を表すXPath文法と一貫性のあるものでない限り、利用することができない。
関数: number sum(node-set)
sum 関数は、引数 node-set の各ノードについてそのノードの文字列値を数値に変換した結果の合計を返す。
関数: number floor(number)
floor 関数は、引数よりも大きくなく、かつ整数である最大の(正の無限大に最も近い)数値を返す。
関数: number ceiling(number)
ceiling 関数は、引数よりも小さくなく、かつ整数である最小の(負の無限大に最も近い)数値を返す。
関数: number round(number)
round 関数は、引数に最も近く、かつ整数である数値を返す。そうした数値が2つある場合、正の無限大に近い方が返される。引数がNaNである場合、NaNが返される。引数が正の無限大である場合、正の無限大が返される。引数が負の無限大である場合、負の無限大が返される。引数が正のゼロである場合、正のゼロが返される。引数が負のゼロである場合、負のゼロが返される。引数が 0 未満だが -0.5 以上である場合、負のゼロが返される。
註: この最後2つのケースについては、**round** 関数を呼び出した結果は、0.5 を加えて floor 関数を呼び出した結果と同じではない。
5 データモデル
XPathは、樹としてのXML文書に作用する。この節は、どのようにしてXPathがXML文書を樹としてモデル化するかを説明する。このモデルはもっぱら概念的なものであって、何らかの具体的な実装を強制するものではない。XML情報セット[XML Infoset]に対するこのモデルの関連性は、[B XML情報セットの割り付け] で説明する。
XPathによる作用を受けるXML文書は、XML名前空間勧告[XML Names]に適合したものでなければならない。
樹はノードを包含する。ノードには7つの型がある。
- ルートノード
- 要素ノード
- テキストノード
- 属性ノード
- 名前空間ノード
- 処理命令ノード
- 注釈ノード
ノード型ごとに、その型のノードの文字列値を決定する方法がある。文字列値がノードの一部であるノード型もある。また文字列値が、子孫ノードの文字列値から計算されるノード型もある。
註: 要素ノードやルートノードについては、ノードの文字列値は、DOMの
nodeValue
メソッド([DOM]を見よ。)によって返される文字列と同じではない。
展開名をもつノード型もある。これは、ローカル部分と名前空間URIとの対からなるものである。ローカル部分は文字列である。名前空間URIは、ヌルであるか文字列であるかのいずれかである。XML文書の中で指定される名前空間URIは、[RFC2396]で定義されているURI参照にすることができる。これは、名前空間URIがフラグメント識別子をとることができ、また相対URIにすることができるという意味である。相対URIは、名前空間の処理の間、絶対URIに解釈されるべきである。データモデル内のノードの展開名の名前空間URIは、絶対URIであるべきである。2つの展開名は、同じローカル部分を持ち、かつ、ともにヌル名前空間URIをとるかともに等しい非ヌル名前空間URIをとるかする場合、等しい。
文書順という整序方法がある。これは文書内のすべてのノードに関して定義されており、一般実体を展開した後の文書のXML表現において、各ノードのXML表現の最初のキャラクタが出現する順序に対応している。そこで、ルートノードが最初のノードということになる。要素ノードは、その子よりも前に出現する。そこで、文書順は、(実体を展開した後の)XMLにおける開始タグが出現する順序で要素ノードを整序する。要素の属性ノードや名前空間ノードは、その要素の子よりも前に出現する。名前空間ノードは、属性ノードの前に出現するものと定義される。名前空間ノードの相対的な順序は、実装依存である。属性ノードの相対的な順序は、実装依存である。逆文書順とは、文書順を逆にしたものである。
ルートノードや要素ノードは、有順序の子ノードリストをもつ。ノードが子を共有することは決してない。あるノードが他のノードと同じノードでない場合、そのノードの子はどれも、もう一つのノードの子のどれとも同じノードではないことになる。ルートノード以外はノードごとにちょうど1個の親があり、これは要素ノードかルートノードかのいずれかである。ルートノードや要素ノードは、その子ノード各自の親である。ノードの子孫とは、ノードの子、およびノードの子の子孫である。
5.1 ルートノード
ルートノードとは、樹のルート(根)である。ルートノードは、樹のルートとして以外には出現しない。文書要素の要素ノードは、ルートノードの子である。ルートノードは、プロローグ部や、文書要素の末尾の後に出現する処理命令や注釈についての、子処理命令ノードや子注釈ノードももつ。
ルートノードの文字列値は、ルートノードの子孫テキストノードすべての文字列値を文書順に結合したものである。
ルートノードには展開名がない。
5.2 要素ノード
文書の中にある要素ごとに、要素ノードがある。要素ノードは、XML名前空間勧告[XML Names]に従い、タグの中で指定されている要素の QName を展開することにより計算される展開名をもつ。要素の展開名の名前空間URIは、QName にプリフィックスがなく、かつ適用可能なデフォルト名前空間がない場合、ヌルということになる。
註: [XML Names] の Appendix A.3 の表記法でいうと、展開名のローカル部分は
ExpEType
要素のtype
属性に対応する。展開名の名前空間URIはExpEType
要素のns
属性に対応し、ExpEType
要素のns
属性が省略されている場合、ヌルである。
要素ノードの子は、要素ノード、注釈ノード、処理命令ノード、内容を表すテキストノードである。内部実体に対する実体参照と外部実体双方に対する実体参照とは、両方とも展開される。キャラクタ参照は、解釈される。
要素ノードの文字列値は、要素ノードの子孫テキストノードすべての文字列値を文書順に結合したものである。
5.2.1 一意的ID
要素ノードは、一意的な識別子(ID)をとってもかまわない。これは、DTDで ID
型として宣言されている属性の値である。1つの文書の中ではどの2つの要素も同じ一意的IDをとってはならない。XMLプロセッサが、1つの文書の中にある2つの要素が同じ一意的IDをとっている(これは文書が妥当でない場合にのみ可能である。)とレポートする場合、文書順における2番目の要素は、一意的IDがないものとして扱わなければならない。
註: 文書がDTDをもたない場合、その文書の中にあるどの要素も一意的IDをとらないことになる。
5.3 属性ノード
要素ノードにはそれぞれ属性ノードのセットが結びつけられている。要素は、これら属性ノード各自の親である。もっとも、属性ノードはその親要素の子ではない。
註: これはDOMとは異なる。DOMは、属性を生み出す要素を属性の親として扱っていない([DOM]を見よ)。
要素は、属性ノードを共有することは決してない。ある要素ノードがもう一つの要素ノードと同じものでない限り、一方の要素ノードの属性ノードには、他方の要素ノードの属性ノードと同じものがないことになる。
註:
=
演算子は、2つのノードが同じ値をもつかどうかをテストするものであって、同じノードであるかどうかをテストする_ものではない_。そこで、2つの異なる要素の属性は、同じノードでないにもかかわらず、=
を用いて等しいものとして比較される場合がある。
デフォルトとされた属性は、明示に指定された属性と同じものとして扱われる。DTDにおいてある属性がその要素型について宣言されたが、デフォルトが #IMPLIED
として宣言され、属性がその要素に関して指定されなかった場合、その要素の属性セットは、その属性を表すノードを包含しない。
属性の中には、xml:lang
や xml:space
といったように、 他の子孫要素上の同じ属性にインスタンスで上書きされない限りはその属性を生み出す要素の子孫である要素すべてに当てはまる意味論をもつものがある。しかし、これは、属性ノードが樹の中に現れるかどうかに影響しない。要素は、その要素の開始タグまたは空要素タグにおいて明示的に指定された属性、またはDTDにおいてデフォルト値つきで明示的に宣言された属性についてのみ、属性ノードをもつ。
属性ノードは、展開名と文字列値とをもつ。展開名は、XML文書にあるタグにおいて指定された QName を、XML名前空間勧告[XML Names]に従い展開することにより計算される。属性名の名前空間URIは、その属性の QName がプリフィックスをもたない場合、ヌルということになる。
註: [XML Names]の Appendix A.3 の表記法では、展開名のローカル部分は、
ExpAName
要素のname
属性に対応する。展開名の名前空間URIは、ExpAName
要素のns
属性に対応するが、ExpAName
要素のns
属性が省略された場合はヌルである。
属性ノードは文字列値をとる。文字列値は、XML勧告[XML]によって規定されている、普通化された値である。普通化された値がゼロ長文字列である属性は、特別な扱いを受けることがない。これは、文字列値がゼロ長文字列である属性ノードとなる。
註: デフォルト属性が、外部DTDや外部パラメータ実体の中で宣言されていることがありうる。XML勧告は、XMLプロセッサが妥当性検証を行うものでない限り、XMLプロセッサに対し、外部DTDや外部パラメータを読むよう要求していない。外部DTDまたは外部パラメータ実体で宣言されたデフォルト属性値がXPath樹に包摂されていることを前提とするスタイルシートその他の装備は、妥当性検証を行わないXMLプロセッサによっては動作しないかもしれない。
名前空間を宣言する属性([XML Names]を見よ。)に対応する属性ノードはない。
5.4 名前空間ノード
各要素には名前空間ノードのセットが結びつけられている。このセットは、その要素のスコープ内にある各別の名前空間プリフィックス(xml
プリフィックスを含む。これはXML名前空間勧告[XML Names]によって黙示的に宣言されている。)につき名前空間ノード1個ずつ、またデフォルト名前空間がその要素のスコープ内にある場合にはそれにつき名前空間ノード1個というものである。要素は、これらの名前空間ノードそれぞれの親である。もっとも、名前空間ノードは、その親要素の子ではない。要素は決して、名前空間ノードを共有することはない。ある要素ノードが他の要素ノードと同じノードでない場合、一方の要素ノードの名前空間ノードの中には、他方の要素ノードの名前空間ノードと同じノードであるものはないことになる。これは、要素が、つぎのものについて1個の名前空間ノードをもつということを意味している。
- 名前が
xmlns:
で始まる要素の属性ごとに。 - 要素自身または世代の近い祖先がそのプリフィックスを宣言し直しているのでない限りにおいて、名前が
xmlns:
で始まる祖先要素の属性ごとに。 - その要素または祖先が
xmlns
属性をもち、かつそうした直近の要素のxmlns
属性の値が非空である場合、xmlns
属性について。註:
xmlns=""
という属性は、デフォルト名前空間の「取消宣言」をする([XML Names]を見よ)。
名前空間ノードは展開名をもつ。ローカル部分は名前空間プリフィックスである(これは、名前空間ノードがデフォルト名前空間についてのものである場合には、空である)。名前空間URIは、つねにヌルである。
名前空間ノードの文字列値は、その名前空間プリフィックスが結びつけられている名前空間URIである。これが相対指定である場合、ちょうど展開名の名前空間URIのように、展開解釈されなければならない。
5.5 処理命令ノード
文書型宣言内部に出現する処理命令を除き、処理命令ごとに処理命令ノードがある。
処理命令は展開名をもつ。ローカル部分は、処理命令のターゲットである。名前空間URIは、ヌルである。処理命令ノードの文字列値は、処理命令のうち、ターゲットおよび空白との後にある部分である。末尾の閉じ ?>
は含まない。
註: XML宣言は、処理命令ではない。したがって、XML宣言に対応する処理命令ノードはない。
5.6 注釈ノード
文書型宣言内部に出現する注釈を除き、注釈ごとに注釈ノードがある。
注釈の文字列値は、注釈の内容であり、開始 <!--
や終了 -->
を含まない。
注釈ノードは展開名をもたない。
5.7 テキストノード
キャラクタデータは、テキストノードにまとめられる。各テキストノードには、可能な限り多くのキャラクタデータがまとめられる。テキストノードは決して、テキストノードである直前または直後の兄弟をもつことがない。テキストノードの文字列値は、キャラクタデータであテキストノードはつねに、少なくとも1個のデータキャラクタをもつ。
CDATAセクション内にある各キャラクタは、キャラクタデータとして扱われる。そこで、ソース文書の <![CDATA[<]]>
は <
と同じく扱われる。ともに、樹のテキストノードでは1個の <
キャラクタとなることになる。そこで、CDATAセクションは、<![CDATA[
や ]]>
が除去され、<
や &
が出現する箇所ごとにそれぞれ <
や &
で置き換えられたかのように扱われる。
註:
<
キャラクタを含んでいるテキストノードがXMLとして書き出されるとき、<
キャラクタは、たとえば<
を使ったり、CDATAセクションの中に組み込んだりして、エスケープしなければならない。
注釈、処理命令、属性値の内部のキャラクタは、テキストノードを生み出さない。外部実体内の行末は、XML勧告[XML]に規定されているとおり、#xAに普通化される。
テキストノードは展開名をもたない。
6 適合性
XPathは、主に、他の仕様書で利用できるコンポーネントとするというのが狙いである。したがって、XPathは、XPathの実装の適合性についての判断基準を規定することは、([XPointer]や[XSLT]といったような)XPathを利用する仕様に頼り、XPathの独立の実装の適合性についての判断基準を定義することはしない。
A 参照資料
A.1 規範的な参照資料
IEEE 754
Institute of Electrical and Electronics Engineers. IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std 754-1985.
RFC2396
T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC 2396. http://www.ietf.org/rfc/rfc2396.txt を見よ。
XML
World Wide Web Consortium. Extensible Markup Language (XML) 1.0. W3C Recommendation. http://www.w3.org/TR/1998/REC-xml-19980210 を見よ。
XML Names
World Wide Web Consortium. Namespaces in XML. W3C Recommendation. http://www.w3.org/TR/REC-xml-names を見よ。
A.2 その他の参照資料
Character Model
World Wide Web Consortium. Character Model for the World Wide Web. W3C Working Draft. http://www.w3.org/TR/WD-charmod を見よ。
DOM
World Wide Web Consortium. Document Object Model (DOM) Level 1 Specification. W3C Recommendation. http://www.w3.org/TR/REC-DOM-Level-1 を見よ。
JLS
J. Gosling, B. Joy, and G. Steele. The Java Language Specification. http://java.sun.com/docs/books/jls/index.html を見よ。
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. International Standard. http://www.iso.ch/cate/d18741.html を見よ。
TEI
C.M. Sperberg-McQueen, L. Burnard Guidelines for Electronic Text Encoding and Interchange. http://etext.virginia.edu/TEI.html を見よ。
Unicode
Unicode Consortium. The Unicode Standard. http://www.unicode.org/unicode/standard/standard.html を見よ。
XML Infoset
World Wide Web Consortium. XML Information Set. W3C Working Draft. http://www.w3.org/TR/xml-infoset を見よ。
XPointer
World Wide Web Consortium. XML Pointer Language (XPointer). W3C Working Draft. http://www.w3.org/TR/WD-xptr を見よ。
XQL
J. Robie, J. Lapp, D. Schach. XML Query Language (XQL). http://www.w3.org/TandS/QL/QL98/pp/xql.html を見よ。
XSLT
World Wide Web Consortium. XSL Transformations (XSLT). W3C Recommendation. http://www.w3.org/TR/xslt を見よ。
XPathデータモデルにおけるノードは、XML情報セット[XML Infoset]によって用意されている情報項目から、以下のようにして引き出すことができる。
註: XML情報セット ワーキングドラフトの新バージョンが、5月17日版を置き換えることになるが、これはXPathの今バージョンの準備が終了した時点では完成間近であり、XPathの今バージョンのリリースと同時あるいは直後にリリースされる予定である。割り付けは、この新バージョンのXML情報セット ワーキングドラフトについて与えられているものである。新バージョンのXML情報セット ワーキングドラフトがまだリリースされていない場合、W3C会員は、内部のワーキンググループ版 http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html (会員専用) を参考にしてもよい。
- ルートノードは、文書情報項目に由来する。ルートノードの子は、children および children - comments プロパティに由来する。
- 要素ノードは、要素情報項目に由来する。要素ノードの子は、children および children - comments プロパティに由来する。要素ノードの属性は、attributes プロパティに由来する。要素ノードの名前空間は、in-scope namespaces プロパティに由来する。要素ノードの展開名のローカル部分は、local name プロパティに由来する。要素ノードの展開名の名前空間URIは、namespace URI プロパティに由来する。要素ノードの一意的IDは、attributes プロパティ内の属性情報項目のうち
ID
に等しい attribute type プロパティをもつものの children プロパティに由来する。 - 属性ノードは、属性情報項目に由来する。属性ノードの展開名のローカル部分は、local name プロパティに由来する。属性ノードの展開名の名前空間URIは、namespace URI プロパティに由来する。ノードの文字列値は、children プロパティの各メンバーの character code プロパティを連結したものに由来する。
- テキストノードは、1個以上の連続したキャラクタ情報項目が連なったものに由来する。ノードの文字列値は、各キャラクタ情報項目の character code プロパティを連結したものに由来する。
- 処理命令ノードは、処理命令情報項目に由来する。ノードの展開名のローカル部分は、target プロパティに由来する(ノードの展開名の名前空間URIは、ヌルである)。ノードの文字列値は、content プロパティに由来する。文書型宣言情報項目の子である処理命令項目についての処理命令ノードはない。
- 注釈ノードは、注釈情報項目に由来する。ノードの文字列値は、content プロパティに由来する。文書型宣言情報項目の子である注釈情報項目についての注釈ノードはない。
- 名前空間ノードは、名前空間宣言情報項目に由来する。ノードの展開名のローカル部分は、prefix プロパティに由来する(ノードの展開名の名前空間URIは、ヌルである)。ノードの文字列値は、namespace URI プロパティに由来する。
どら猫本舗 (webmaster@doraneko.org)