この標準情報(TR)は, 1999年11月にWorld Wide Web Consortium(W3C)から公表されたXML Path Language (XPath) Version 1.0 勧告を翻訳し, 技術的内容を変更することなく作成した標準情報(TR)である。
XPathは, XML文書の部分を番地付けするための言語であり, XSLT及びXPointerの両者によって用いられる設計となっている。
XPathは, XSL変換[XSLT]とXPointer[XPointer]との間で共有される機能に関する共通の構文及びセマンティクスを提供するための活動によって得られた。XPathの主要な目的は, XML[XML]文書の部分を番地付けすることにある。この主要な目的を支えるために, XPathは, 文字列型, 数値型及び論理値型を扱うための基本的な機能も提供する。XPathは, URI及びXMLの属性値の中でXPathを利用しやすくするために, コンパクトで非XMLの構文を用いる。XPathは, XML文書の表面的な構文ではなく, XML文書の抽象的で論理的な構造を操作する。XPathは, XML文書の階層構造をたどるURLにおけるように, パス記法を利用することから, その名が付いている。
番地付けのためのXPathの使用に加えて, XPathは, 一致をとる(ノードがパタンに一致するかどうかを試験する)のために使用できる自然なサブセットをもつ設計もなされている。XPathのこの使用は, XSLTにおいて示される。
XPathは, XML文書をノード木としてモデル化する。要素ノード, 属性ノード及びテキストノードを含むさまざまノードの型がある。XPathは, ノードの各型に関して文字列値を計算する方法を定義する。名前ももつノードの型がある。XPathは, XML名前空間[XML Names]を完全にサポートする。そこで, ノードの名前は, 局所部分とヌルになることもある名前空間URIとからなる対としてモデル化される。これは展開名と呼ばれる。データモデルは, [5 データモデル]において詳細に示す。
XPathにおける主要な構文構成子は, 式とする。式は, 生成規則Exprに一致する。式は, 評価されてオブジェクトを生じる。このオブジェクトは, 次の四つの基本的な型の一つをもつ。
式の評価は, 文脈に関して起きる。XSLT及びXPointerは, それぞれXSLT及びXPointerで用いるXPath式について文脈がどのように決定されるかを規定する。文脈は, 次のもので構成される。
文脈位置は, 常に文脈サイズ以下とする。
変数結合は, 変数名から変数値への対応から成る。変数の値は, オブジェクトであり, 式の値について可能な任意の型をもつことができ, ここに規定されていない追加の型もとってよい。
関数ライブラリは, 関数名から関数への対応から成る。各関数は, 0個以上の引数をとり, 単一の結果を返す。この標準情報(TR)は, すべてのXPath実装がサポートしなければならないコア関数ライブラリを定義する([4 コア関数ライブラリ]を参照)。コア関数ライブラリの関数については, 引数及び結果は, 四つの基本的な型をもつ。XSLT及びXPointerのどちらも, 追加の関数を定義することによって, XPathを拡張する。これらの関数の幾つかは, 四つの基本的な型を操作し, 他の関数はXSLT及びXPointerが定義する追加のデータ型を操作する。
名前空間宣言は, 接頭辞から名前空間URIへの対応から成る。
部分式を評価するのに使われる変数結合, 関数ライブラリ及び名前空間宣言は, 部分式を含む式を評価するのに使われるそれらと常に同じとする。部分式を評価するのに使われる文脈ノード, 文脈位置及び文脈サイズは, 部分式を含む式を評価するのに使われるそれらとは異なることがある。幾つか種類の式は, 文脈ノードを変更する。述部だけが, 文脈位置及び文脈サイズを変更する([2.4 述部]を参照)。ある種類の式の評価が記述されるとき, 部分式の評価で文脈ノード, 文脈位置及び文脈サイズが変われば, それは常に明示的に示される。文脈ノード, 文脈位置及び文脈サイズについて何も示されなければ, その種類の式の部分式の評価では, それらに変更はない。
XPath式は, XML属性の中に現われることが多い。ここに規定する文法は, XML 1.0の正規化の後の属性値に適用される。そこで例えば,
文法が文字<
を用いるとき, これはXMLソースの中で<
として現れてはならず, 例えば<
としてそれを入れることによって, XML 1.0の規則に従って引用されなければならない。式の中では, リテラル列は, 1重引用符又は2重引用符によって区切られるが, それらは, XML属性を区切るのにも使われる。式の中の引用符が, XMLプロセサによって属性値を終端していると解釈されることを避けるため, 引用符は, 文字参照("
又は'
)として入れることができる。これに代えて, XML属性が2重引用符で区切られているときには, 式は1重引用符を使うことができ, その逆もできる。
重要な種類の式の一つに, 位置パスがある。位置パスは, 文脈ノードに対して相対的にノードの集合を選ぶ。位置パスである式を評価した結果は, その位置パスによって選ばれるノードを含むノード集合とする。位置パスは, ノードの集合をフィルタリングするのに使われる式を再帰的に含むことができる。位置パスは, 生成規則LocationPathに一致する。
次の文法において, 非終端記号のQName及びNCNameは, [XML Names]で定義され, Sは, [XML]で定義される。文法は, [XML]と同じEBNF記法を用いる。(文法の記号が常に先頭の大文字をもつことを除く。)
式は, まず解析対象の文字列をトークンに分割し, それから結果のトークン列を解析することによって, 構文解析される。トークンの間には空白を自由に使うことができる。トークン化処理は, [3.7 字句構造]において示す。
位置パスは, 言語の中で最も一般的な文法的構成子ではない(LocationPathは, Exprの特別な場合である。)が, 最も重要な構成子なので, 最初にそれを示す。
位置パスはどれも, 直接的ではあるが少しばかり面倒な構文を使って表わせる。共通のケースを簡潔に表わせる多くの構文的短縮形もある。2.は, 非短縮構文を使って, 位置パスのセマンティクスを説明する。その後で短縮構文は, それがどのように非短縮構文に展開するかを示すことによって説明される([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
は, 親olist
をもち, 文脈ノードと同じ文書にあるitem
要素のすべてを選択する。
child::para[position()=1]
は, 文脈ノードの最初の子para
を選択する。
child::para[position()=last()]
は, 文脈ノードの最後の子para
を選択する。
child::para[position()=last()-1]
は, 文脈ノードの最後から2番目の子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"]
は, 値がwarning
であるtype
属性をもつ, 文脈ノードの子どもpara
のすべてを選択する。
child::para[attribute::type='warning'][position()=5]
は, 値がwarning
のtype
属性をもつ, 文脈ノードの5番目の子para
を選択する。
child::para[position()=5][attribute::type="warning"]
は, 文脈ノードの5番目の子para
を, それが値warning
をとるtype
属性をもつ場合に, 選択する。
child::chapter[child::title='Introduction']
は, 文脈ノードの子どもchapter
で, 文字列値がIntroduction
に等しい1個以上の子どもtitle
をもつものを選択する。
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個以上の位置パスの列から成る。相対位置パスの中のステップは, 左から右へ一つに構成される。各ステップは順次, 文脈ノードに対して相対的にノードの集合を選択する。ステップの初期列は, 次のとおりに後続ステップとともに一つに構成される。ステップの初期列は, 文脈ノードに対して相対的にノードの集合を選択する。その集合の各ノードは, 次のステップの文脈ノードとして使われる。そのステップによって特定されるノードの集合は, 一つに統合される。ステップの構成によって特定されるノードの集合は, 統合されて一つになる。例えば, child::div/child::para
は, 文脈ノードの子ども要素div
の子ども要素para
を選択する。言い換えると, 親div
をもつ孫要素para
を選択する。
絶対位置パスは,/
から成り,オプションで相対位置パスが後続する。/
はそれ自体で, 文脈ノードを含む文書のルートノードを選択する。その後に相対位置パスが続く場合には, その位置パスは, 文脈ノードを含む文書のルートノードに対して相対的な相対位置パスによって選択されることになるノードの集合を選択する。
[1] | LocationPath | ::= | RelativeLocationPath | |
| AbsoluteLocationPath | ||||
[2] | AbsoluteLocationPath | ::= | '/' RelativeLocationPath? | |
| AbbreviatedAbsoluteLocationPath | ||||
[3] | RelativeLocationPath | ::= | Step | |
| RelativeLocationPath '/' Step | ||||
| AbbreviatedRelativeLocationPath |
位置ステップは, 次の3部分をもつ。
位置ステップによって選択されるノードと文脈ノードとの木関係を指定する軸。
ノード型と, 位置ステップによって選択されるノードの展開名とを指定するノード試験。
位置パスによって選択されるノードの集合をさらに洗練するために, 任意の式を用いる0個以上の述部。
位置ステップの構文は, 2重コロンによって分けられた軸の名前及びノード試験であって, それぞれ角括弧で括られた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 |
次に示す軸が利用できる。
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
,descendant
,following
,preceding
及びself
の軸は, (属性ノード及び名前空間ノードを無視して)文書を区分する。これらは重畳せず, 一緒に文書中のすべてのノードを含む。
どの軸にも主ノード型がある。軸が要素を含むことができるとき, 主ノード型は要素となる。そうではないときは, 軸が含むことができるノードの型になる。そこで, 次のとおりとなる。
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である引数をもってもよい。この場合, Literalの値に等しい名前をもつどの処理命令についても真である。
ノード試験node()
は, どの型をもつどのノードについても真である。
[7] | NodeTest | ::= | NameTest | |
| NodeType '(' ')' | ||||
| 'processing-instruction' '(' Literal ')' |
軸は, 順方向軸か逆方向軸かのどちらかとする。文脈ノード, 又は文書順に文脈ノードの後にあるノードだけしか含まない軸は, 順方向軸とする。文脈ノード, 又は文書順に文脈ノードの前にあるノードだけしか含まない軸は, 逆方向軸とする。そこで, ancestor軸, ancestor-or-self軸, preceding軸, preceding-sibling軸は, 逆方行軸とする。その他の軸は, すべて順方行軸とする。self軸は常に最大で1個のノードしか含まないから, 順方行軸でも逆方行軸でも差異はない。軸に関するノード集合のメンバの近接度位置(proximity position)は, 軸が順方行軸であるときは文書順に, 逆方行軸であるときは逆文書順に順序付けたノード集合におけるそのノードの位置と定義される。最初の位置は, 1とする。
述部は, 軸に関してノード集合をフィルタリングして, 新しいノード集合を作る。フィルタリングされるはずのノード集合にあるノードごとに, PredicateExprは, そのノードを文脈ノードとし, そのノード集合のノード数を文脈サイズとし, 軸に関してノード集合におけるノードの近接度位置を文脈位置として, 評価される。PredicateExprがそのノードについて真と評価されるときは, そのノードは新しいノード集合に含まれる。そうでない場合には, それは含まれない。
PredicateExprは, Exprを評価してその結果を論理型に変換することによって, 評価される。結果が数値型である場合には, その結果は, 数値型が文脈位置に等しい場合には真に変換され, それ以外の場合には偽に変換される。結果が数値型でない場合には, 結果は, boolean関数への呼び出しによるかのように変換される。そこで, para[3]
という位置パスは, para[position()=3]
と等価になる。
[8] | Predicate | ::= | '[' PredicateExpr ']' | |
[9] | PredicateExpr | ::= | Expr |
短縮構文を使った位置パスの例を次に示す。
para
は, 文脈ノードの子ども要素para
を選択する。
*
は, 文脈ノードの子ども要素のすべてを選択する。
text()
は, 文脈ノードの子どもテキストノードのすべてを選択する。
@name
は, 文脈ノードのname
属性を選択する。
@*
は, 文脈ノードのすべての属性を選択する。
para[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
は, 親olist
をもち, 文脈ノードと同じ文書にあるitem
要素のすべてを選択する。
.
は, 文脈ノードを選択する。
.//para
は, 文脈ノードの子孫要素para
を選択する。
..
は, 文脈ノードの親を選択する。
../@lang
は, 文脈ノードの親のlang
属性を選択する。
para[@type="warning"]
は, 値warning
をとるtype
属性をもつ, 文脈ノードの子どもpara
のすべてを選択する。
para[@type="warning"][5]
は, 値warning
をとるtype
属性をもつ, 文脈ノードの5番目の子para
を選択する。
para[5][@type="warning"]
は, 文脈ノードの5番目の子para
を, それが値warning
をとるtype
属性をもつときに, 選択する。
chapter[title="Introduction"]
は, 文字列値がIntroduction
に等しい1個以上の子title
をもつ, 文脈ノードの子どもchapter
を選択する。
chapter[title]
は, 1個以上の子どもtitle
をもつ, 文脈ノードの子どもchapter
を選択する。
employee[@secretary and @assistant]
は, 文脈ノードの子どもemployee
で, secretary
属性及びassistant
属性の両方をもつもののすべてを選択する。
最も重要な短縮形は, child::
を位置ステップから省けることとする。実効的には, child
はデフォルトの軸とする。例えば, div/para
という位置パスは, child::div/child::para
に関する短縮である。
属性に関する短縮形もある。attribute::
は, @
に短縮できる。例えば, para[@type="warning"]
という位置パスは, child::para[attribute::type="warning"]
の短縮であって, warning
に等しい値をとるtype
属性をもつ子ども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
を選択する。前者は, その親の最初の子ども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 | ::= | '@'? |
VariableReferenceは,文脈における変数結合の集合の中で変数名が結合されている値に評価される。変数名が,式の文脈における変数結合の集合の中でいかなる値にも結合されていない場合には,エラーとする。
括弧は,グループ化を行うために使用してよい。
[14] | Expr | ::= | OrExpr | |
[15] | PrimaryExpr | ::= | VariableReference | |
| '(' Expr ')' | ||||
| Literal | ||||
| Number | ||||
| FunctionCall |
FunctionCall式は,式評価文脈関数ライブラリの中の関数を識別するためにFunctionNameを使用し,Argumentの各々を評価し,各引数を関数が要求する型に変換し,最後に,関数を呼び出してその変換された引数を関数に渡すことによって,評価される。引数の個数が間違っている場合,又は引数が要求される型に変換できない場合には,エラーとする。FunctionCall式の結果は,呼び出される関数が返す結果とする。
引数は,string関数の呼出しによって行われるものとして,文字列型に変換される。引数は,number関数の呼出しによって行われるものとして,数値型に変換される。引数は,boolean関数の呼出しによって行われるものとして,論理型に変換される。ノード集合型ではない引数は,ノード集合に変換できない。
[16] | FunctionCall | ::= | FunctionName '(' ( Argument ( ',' Argument )* )? ')' | |
[17] | Argument | ::= | Expr |
位置パスは,式として使用できる。その式は,パスによって選択されるノードの集合を返す。
|
演算子は,そのオペランドの和集合を計算するが,オペランドは,ノード集合でなければならない。
Predicateは,位置パスで使用するのと同じ方法で,式をろ過するために使用する。ろ過される式がノード集合に評価されない場合には,エラーとする。Predicateは,子軸に関してノード集合をろ過する。
備考 Predicateの意味は,どの軸を適用するかに決定的に依存する。例えば,preceding::foo[1]
は,逆文書順 で最初のfoo
要素を返す。これは,[1]
という述部に適用される軸が先行する軸になることによる。反対に,(preceding::foo)[1]
は,文書順 で最初のfoo
要素を返す。これは,[1]
という述部に適用される軸が子軸になることによる。
/
演算子及び //
演算子は,式及び相対的位置パスを構成する。式がノード集合に評価されない場合,エラーとする。/
演算子は,/
を位置パスで使用するときと同じ方法で構成を行う。位置パスにおけるのと同様に,//
は,/descendant-or-self::node()/
の短縮形とする。
ノード集合に変換可能なオブジェクトの型は存在しない。
[18] | UnionExpr | ::= | PathExpr | |
| UnionExpr '|' PathExpr | ||||
[19] | PathExpr | ::= | LocationPath | |
| FilterExpr | ||||
| FilterExpr '/' RelativeLocationPath | ||||
| FilterExpr '//' RelativeLocationPath | ||||
[20] | FilterExpr | ::= | PrimaryExpr | |
| FilterExpr Predicate |
論理型のオブジェクトは,二つの値,真(true)及び偽(false),の一つをもつことができる。
or
式は,各々のオペランドを評価し,その値をboolean関数への呼出しを行ったものとして論理型に変換することによって評価される。結果は,(オペランドの)どちらかの値が真の場合に真とし,そうでない場合は偽とする。右側のオペランドは,左側のオペランドが真と評価される場合には,評価されない。
and
式は,各々のオペランドを評価し,その値をboolean関数への呼出しを行ったものとして論理型に変換することによって評価される。結果は,(オペランドの)両方の値が真の場合に真とし,そうでない場合は偽とする。右側のオペランドは,左側のオペランドが偽と評価される場合には,評価されない。
(RelationalExprではない)EqualityExpr又は(AdditiveExprではない)RelationalExprは,二つのオペランドを評価した結果のオブジェクトを比較することによって評価される。結果のオブジェクトの比較は,次の三つの段落で定義する。最初に,ノード集合を含む比較をノード集合を含まない比較を用いて定義する。これは,=
,!=
,<=
,<
,>=
及び >
に対して統一的に定義される。2番目に,ノード集合を含まない比較を =
及び !=
に対して定義する。3番目に,ノード集合を含まない比較を <=
,<
,>=
及び >
に対して定義する。
比較する両方のオブジェクトがノード集合の場合,その比較は,あるノードが最初のノード集合の中に存在し,さらにあるノードが2番目のノード集合の中にも存在して,その二つのノードの文字列値に関して比較を実行した結果が真の場合及びその場合に限り,真になる。比較する一つのオブジェクトがノード集合であって他方が数値の場合,その比較は,あるノードがノード集合の中に存在して,そのノードの文字列値をnumber関数を用いて数値に変換した結果及びそれと比較する数値に関して比較を実行した結果が真の場合及びその場合に限り,真になる。比較するオブジェクトの一つがノード集合であって他方が文字列の場合,その比較は,あるノードがノード集合の中に存在し,そのノードの文字列値及び他方の文字列に関して比較を実行した結果が真の場合及びその場合に限り,真になる。比較する一つのオブジェクトがノード集合であって他方が論理型の場合,その比較は,その論理型,及びノード集合をboolean関数を用いて論理型に変換した結果に関して比較を実行した結果が真の場合及びその場合に限り,真になる。
比較するオブジェクトのいずれもがノード集合ではなく,演算子が =
又は !=
の場合,それらのオブジェクトは,次に示すとおりの共通型に変換しその後に比較することによって比較する。比較するオブジェクトの少なくとも一つが論理型の場合,比較する各々のオブジェクトは,boolean関数を適用するものとして論理型に変換する。そうでない場合であって,比較するオブジェクトの少なくとも一つが数値の場合,比較する各々のオブジェクトは,number関数を適用するものとして数値に変換する。そうでない場合,比較するオブジェクトの両方は,string関数を適用するものとして文字列に変換する。=
の比較は,オブジェクトが等しい場合及びその場合に限り,真になる。!=
の比較は,オブジェクトが等しくない場合及びその場合に限り,真になる。数値は,IEEE 754 [IEEE 754]に従う等しさで比較する。二つの論理型は,両方が真又は両方が偽のいずれかの場合及びその場合に限り,等しい。二つの文字列は,それらがUCS文字の同じ列から成る場合及びその場合に限り,等しい。
備考$x
がノード集合に結合されている場合,$x="foo"
は,not($x!="foo")
と同じことを意味しない。$x="foo"
は,$x
の中のある ノードが文字列値foo
をもつ場合及びその場合に限り,真になる。not($x!="foo")
は,$x
の中のすべて のノードが文字列値foo
をもつ場合及びその場合に限り,真になる。
比較するオブジェクトのいずれもがノード集合でなく,演算子が <=
,<
,>=
又は >
の場合,それらのオブジェクトは,両方を数値に変換しIEEE 754に従って数値を比較することによって比較する。<
の比較は,最初の数値が2番目の数値よりも小さい場合及びその場合に限り,真になる。<=
の比較は,最初の数値が2番目の数値以下の場合及びその場合に限り,真になる。>
の比較は,最初の数値が2番目の数値よりも大きい場合及びその場合に限り,真になる。>=
の比較は,最初の数値が2番目の数値以上の場合及びその場合に限り,真になる。
備考 XPath式がXML文書に現れる場合,<
及び<=
演算子は,XML 1.0の規則に従って,例えば,<
及び<=
を用いて引用されなければならない。次の例では,test
属性の値が,XPath式になっている。
<xsl:if test="@value < 10">...</xsl:if>
[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
と等価であって,偽と評価される。
数値は,浮動小数点数値を表現する。数値は,倍精度64ビットフォーマットのIEEE 754値[IEEE 754]をもつことができる。これらには,"非数"(Not-a-Number,NaN)値,正の無限大及び負の無限大,並びに正の0及び負の0が含まれる。IEEE 754規定の主要な要約については,[JLS]の4.2.3を参照すること。
数値演算子は,そのオペランドを,number関数の呼出しを行うものとして,数値に変換する。
+
演算子は,加算を実行する。
-
演算子は,減算を実行する。
備考 XMLは名前の中に-
を許しているので,通常,-
演算子は,空白によって先行される必要がある。例えば,foo-bar
は,foo-bar
と名前が付けられた子要素を含むノード集合に評価される。foo - bar
は,最初のfoo
子要素の文字列値を数値に変換した結果と,最初のbar
子要素の文字列値を数値に変換した結果との差に評価される。
div
演算子は,IEEE 754に従った浮動小数点の除算を実行する。
mod
演算子は,切捨て(truncating)除算からの剰余を返す。次に例を示す。
5 mod 2
は,1
を返す。
5 mod -2
は,1
を返す。
-5 mod 2
は,-1
を返す。
-5 mod -2
は,-1
を返す。
備考 これは,Java及びECMAScriptにおける%
演算子と同じになっている。
備考 これは,IEEE 754の剰余演算子とは同じではない。IEEE 754の剰余演算子は,丸め(rounding)除算からの剰余を返す。
[25] | AdditiveExpr | ::= | MultiplicativeExpr | |
| AdditiveExpr '+' MultiplicativeExpr | ||||
| AdditiveExpr '-' MultiplicativeExpr | ||||
[26] | MultiplicativeExpr | ::= | UnaryExpr | |
| MultiplicativeExpr MultiplyOperator UnaryExpr | ||||
| MultiplicativeExpr 'div' UnaryExpr | ||||
| MultiplicativeExpr 'mod' UnaryExpr | ||||
[27] | UnaryExpr | ::= | UnionExpr | |
| '-' UnaryExpr |
文字列は,0個以上の文字の列から成る。ここで,文字とは,XML勧告[XML]におけるとおりに定義される。そこで,XPathにおける単一の文字とは,単一の対応するUnicodeスカラ値をもつ単一のUnicode抽象文字([Unicode]参照)に相当する。これは,16ビットのUnicode符号値と同じではない。U+FFFFよりも大きなUnicodeスカラ値をもつ抽象文字のためのUnicode符号化文字表現は,16ビットのUnicode符号値の対(サロゲートペア,surrogate pair)になる。多くのプログラム言語では,文字列は,16ビットのUnicode符号値の列によって表現される。それらの言語でのXPathの実装は,サロゲートペアが単一のXPath文字として正しく取り扱われることを確実に行うように注意しなければならない。
備考 Unicodeでは,Unicode抽象文字の異なる列から成るにもかかわらず,同一として取り扱われることが望ましい二つの文字列が存在する可能性がある。例えば,幾つかのアクセント付き文字は,事前構成された形式又は分解された形式のいずれかで表現してよい。そのために,XPath式における文字及びXML文書における文字の両方が正準形式に正規化されていない場合には,XPath式は,期待しない結果を返すことがある。[Character Model]を参照すること。
トークン化を行う場合,最も長い可能なトークンが常に返される。
読みやすさのために,空白は,文法によって明示的に許されない場合であっても,式の中で使用してもよい。すなわち,ExprWhitespaceを,ExprTokenの前後のパタン内に自由に追加してもよい。
ExprToken文法をあいまいにしないために,次の特殊なトークン化規則を指定された順序で適用しなければならない。
先行するトークンが存在し,その先行するトークンが @
,::
,(
,[
,,
又は Operatorの一つではない場合,*
は,MultiplyOperatorとして認識しなければならず,NCNameは,OperatorNameとして認識しなければならない。
挿入されているかもしれないExprWhitespaceの後のNCNameに続く文字が (
となる場合,そのトークンは,NodeType又はFunctionNameとして認識しなければならない。
挿入されているかもしれないExprWhitespaceの後のNCNameに続く二つの文字が ::
となる場合,そのトークンは,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実装が式を評価するために使用する関数ライブラリの中に常に含めなければならない関数を記述する。
関数ライブラリの中の各関数は,関数の原型(prototype)を用いて指定される。この原型は,返却型,関数の名前及び引数型を与える。引数型の後に疑問符("?")がある場合には,その引数はオプションとする。そうでない場合には,引数は必須とする。
last関数は,式評価文脈から文脈サイズに等しい数値を返す。
position関数は,式評価文脈から文脈位置に等しい数値を返す。
count関数は,引数であるノード集合の中のノードの数を返す。
id関数は,一意ID([5.2.1 一意ID]参照)によって要素を選択する。idへの引数がノード集合型の場合,結果は,引数であるノード集合の中の各々のノードの文字列値にidを適用した結果の和集合とする。idへの引数がそれ以外の型の場合,その引数は,string関数への呼出しによるものとして文字列に変換される。その文字列は,トークンの空白で区切られたリストに分けられる。空白は,生成規則Sにマッチする文字の列とする。結果は,リストの中のトークンに等しい一意IDをもつ文脈ノードと同じ文書の中の要素を含むノード集合とする。
id("foo")
は,一意ID foo
をもつ要素を選択する。
id("foo")/child::para[position()=5]
は,一意ID foo
をもつ要素の子である5番目の para
を選択する。
local-name関数は,引数であるノード集合の中の文書順で最初のノードの展開名の局所部分を返す。引数のノード集合が空か,又は最初のノードが展開名をもたない場合には,空文字列が返される。引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。
関数 文字列型 namespace-uri(ノード集合型 ?)
namespace-uri関数は,引数であるノード集合の中の文書順で最初のノードの展開名の名前空間URIを返す。引数のノード集合が空,最初のノードが展開名をもたない,又は展開名の名前空間URIがヌルの場合には,空文字列が返される。引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。
備考 namespace-uri関数が返す文字列は,要素ノード及び属性ノードについて以外は空になる。
name関数は,引数であるノード集合の中の文書順で最初のノードの展開名を表現するQNameを含む文字列を返す。QNameは,展開名が表現されているノード上で実効的な名前空間宣言に関して,その展開名を表現しなければならない。通常は,これは,XMLソースに出現したQNameになる。そのノード上に複数の接頭辞を同じ名前空間に関連付ける複数の名前空間宣言が存在する場合には,そうなる必要はない。しかし,実装は,ノードのその表現に元々の接頭辞についての情報を含めてもよい。この場合,実装は,返される文字列が常にXMLソースの中で使用されているQNameと確実に同じにできる。引数であるノード集合が空か,又は最初のノードが展開名をもたない場合,空文字列が返される。引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。
備考 name関数が返す文字列は,要素ノード及び属性ノードについて以外は,local-name関数が返す文字列と同じになる。
string関数は,次のとおりに,オブジェクトを文字列に変換する。
ノード集合は,そのノード集合の中の文書順で最初のノードの文字列値を返すことによって,文字列に変換される。ノード集合が空の場合には,空文字列が返される。
数値は,次のとおりに文字列に変換される。
NaNは,文字列 NaN
に変換される。
正の0は,文字列 0
に変換される。
負の0は,文字列 0
に変換される。
正の無限大は,文字列 Infinity
に変換される。
負の無限大は,文字列 -Infinity
に変換される。
数値が整数の場合,その数値は,10進小数点及び先行する0のないNumberとして,10進形式で表現される。数値が負の場合には,マイナス記号( -
)を最初に付ける。
そうでない場合には,数値は,10進小数点の前に少なくとも一つの数字をもち,10進小数点の後に少なくとも一つの数字をもつ10進小数点を含んだNumberとして,10進形式で表現される。数値が負の場合には,マイナス記号( -
)を最初に付ける。10進小数点の直前の一つの必須の数字以外は,10進小数点の前に先行する0が存在してはならない。10進小数点の後の一つの必須の数字以外に,その数値をすべての他のIEEE 754数値から一意に区別するために必要とする,より多くの,しかし必要な個数だけの数字が存在しなければならない。
論理型の偽の値は,文字列 false
に変換される。論理型の真の値は,文字列 true
に変換される。
以上の四つの基本型以外の型のオブジェクトは,その型に依存する方法で,文字列に変換される。
引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。
備考string
関数は,利用者への表示のために数値を文字列に変換することを意図していない。[XSLT]におけるformat-number
関数及びxsl:number
要素が,この機能を提供する。
関数 文字列型 concat(文字列型, 文字列型, 文字列型 *)
concat関数は,その引数の(文字列の)連結を返す。
関数 論理型 starts-with(文字列型, 文字列型 )
starts-with関数は,最初の引数の文字列が2番目の文字列の引数で開始する場合に,真を返す。そうでない場合に,偽を返す。
contains関数は,最初の引数の文字列が2番目の引数の文字列を含む場合に,真を返す。そうでない場合に,偽を返す。
関数 文字列型 substring-before(文字列型, 文字列型 )
substring-before関数は,最初の引数の文字列の中における2番目の引数の文字列の最初の出現に先行する最初の引数の文字列の部分文字列を返す。最初の引数の文字列が2番目の引数の文字列を含まない場合には,空文字列を返す。例えば,substring-before("1999/04/01","/")
は,1999
を返す。
関数 文字列型 substring-after(文字列型, 文字列型)
substring-after関数は,最初の引数の文字列の中における2番目の引数の文字列の最初の出現に続く最初の引数の文字列の部分文字列を返す。最初の引数の文字列が2番目の引数の文字列を含まない場合には,空文字列を返す。例えば,substring-after("1999/04/01","/")
は,04/01
を返し,substring-after("1999/04/01","19")
は,99/04/01
を返す。
関数 文字列型 substring(文字列型, 数値型, 数値型 ?)
substring関数は,2番目の引数で指定された位置で開始する3番目の引数で指定された長さをもつ最初の引数の文字列の部分文字列を返す。例えば,substring("12345",2,3)
は,"234"
を返す。3番目の引数が指定されない場合には,2番目の引数で指定された位置で開始しその文字列の最後まで続く(最初の引数の文字列の)部分文字列を返す。例えば,substring("12345",2)
は,"2345"
を返す。
より正確には,文字列[3.6 文字列型]参照)における各々の文字は,一つの数値的な位置をもつと考えられる。すなわち,最初の文字の位置は1とし,2番目の文字の位置は2とし,以下同様とする。
備考 これは,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)
は,""
を返す。
string-length関数は,文字列([3.6 文字列型]参照)の中の文字の個数を返す。引数が省略された場合には,文字列に変換された文脈ノード,言い換えると,文脈ノードの文字列値,をデフォルトとする。
関数 文字列型 normalize-space(文字列型 ?)
normalize-space関数は,引数の文字列を,先行する空白及び後続する空白を取り除き空白文字の列を一つのスペースに置き換えることによって正規化された空白をもつ文字列にして返す。空白文字は,XMLにおけるS生成規則によって許されるとおりのものと同じとする。引数が省略された場合には,文字列に変換された文脈ノード,言い換えると,文脈ノードの文字列値,をデフォルトとする。
関数 文字列型 translate(文字列型, 文字列型, 文字列型 )
translate関数は,最初の引数の文字列を,2番目の引数の文字列の中の文字の出現を3番目の引数の文字列の中の対応する位置にある文字で置き換えて返す。例えば,translate("bar","abc","ABC")
は,文字列 BAr
を返す。(2番目の引数の文字列が3番目の引数の文字列よりも長いために,)3番目の引数の文字列の中の対応する位置に文字をもたない,2番目の引数の文字列の中の文字が存在する場合には,最初の引数の文字列の中のその文字の出現は取り除かれる。例えば,translate("--aaa--","abc-","ABC")
は,"AAA"
を返す。一つの文字が2番目の引数の文字列の中に一回よりも多く出現する場合には,最初の出現が,その置換する文字を決定する。3番目の引数の文字列が2番目の引数の文字列よりも長い場合には,余分な文字は無視される。
備考 translate関数は,すべての言語における大文字・小文字の変換のための十分な解ではない。XPathの将来の版は,大文字・小文字の変換のための追加関数を提供するかもしれない。
boolean関数は,次のとおりに,その引数を論理型に変換する。
数値は,正の0,負の0又はNaNのいずれでもない場合及びその場合に限り,真とする。
ノード集合は,空でない場合及びその場合に限り,真とする。
文字列は,その長さが0でない場合及びその場合に限り,真とする。
四つの基本型以外の型であるオブジェクトは,その型に依存する方法で論理型に変換される。
not関数は,その引数が偽の場合に真を返し,そうでない場合に偽を返す。
true関数は,真を返す。
false関数は,偽を返す。
lang関数は,xml:lang
属性によって指定されたとおりの文脈ノードの言語が引数の文字列によって指定された言語と同じ又はそれの部分言語(sublanguage)になっているかどうかに依存して,真又は偽を返す。文脈ノードの言語は,その文脈ノードの xml:lang
属性の値によって決定されるか,又は文脈ノードが xml:lang
属性をもたない場合には,その文脈ノードの xml:lang
属性をもつ直近の先祖における xml:lang
属性の値によって決定される。それらの属性が存在しない場合には,langは,偽を返す。それらの属性が存在する場合には,その属性値が大文字・小文字を無視した引数に等しいとき,又は -
で開始する添え字が存在し,その属性値の添え字を無視し大文字・小文字を無視した引数にその属性値が等しいとき,真を返す。例えば,lang("en")
は,文脈ノードが次の五つの要素のいずれかである場合に,真を返す。
<para xml:lang="en"/> <div xml:lang="en"><para/></div> <para xml:lang="EN"/> <para xml:lang="en-us"/>
number関数は,次のとおりに,その引数を数値に変換する。
オプションの空白,オプションのマイナス記号,Number及び空白がこの順序で続く文字列は,(IEEE 754の直近への丸め規則に従って,)その文字列が表現する数学的な値に最も近いIEEE 754の数値に変換される。それ以外の文字列は,NaNに変換される。
論理型の真は,1に変換される。論理型の偽は,0に変換される。
ノード集合は,最初にstring関数への呼出しによるものとして文字列に変換され,次に文字列引数と同じ方法で変換される。
四つの基本型以外の型のオブジェクトは,その型に依存する方法で数値に変換される。
引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。
備考 number関数は,XML文書の中の要素が言語中立のフォーマットで数値データを表現する型になっていない場合,その要素に出現する数値データを変換するために使用しないほうがよい。(言語中立のフォーマットの数値データは,通常は,利用者に表示するために言語特有のフォーマットに変換される。) さらに,number関数は,その要素が使用する言語中立のフォーマットがNumberのためのXPath構文と矛盾する場合には,使用できない。
sum関数は,引数のノード集合の中の各ノードに対して,そのノードの文字列値を数値に変換した結果の合計を返す。
floor関数は,その引数より大きくなく整数である最大の(正の無限大に最も近い)数値を返す。
ceiling関数は,その引数より小さくなく整数である最小の(負の無限大に最も近い)数値を返す。
round関数は,その引数に最も近い整数の数値を返す。そのような二つの数値が存在する場合には,正の無限大に最も近いものを返す。引数がNaNの場合には,NaNを返す。引数が正の無限大の場合には,正の無限大を返す。引数が負の無限大の場合には,負の無限大を返す。引数が正の0の場合には,正の0を返す。引数が負の0の場合には,負の0を返す。引数が0よりも小さいが,-0.5以上の場合には,負の0を返す。
備考 これらの最後の二つの場合については,round関数を呼び出した結果は,0.5を加えてその次にfloor関数を呼び出した結果と同じではない。
XPathは,木としてのXML文書を操作する。5.では,どのようにしてXPathが XML文書を木としてモデル化するかを記述する。このモデルは,単に概念的なもので あり,何らかの特別な実装を強制するわけではない。このモデルの,XML情報集合 [XML Infoset] に対する関係は, [B. XML情報集合との対応付け] において記述される。
XPathによって操作されるXML文書は,XML名前空間勧告 [XML Names]に適合しなければならない。
木はノードを含む。ノードには次の七つの型がある。
ルートノード
要素ノード
テキストノード
属性ノード
名前空間ノード
処理命令ノード
注釈ノード
すべてのノード型に対して,その型のノードに対する文字列値を決定する方法がある。 あるノード型に対しては,文字列値はノードの一部とし,別のノード型に対しては, 文字列値は子孫ノードの文字列値から計算される。
備考 要素ノード及びルートノードの場合は,ノードの文字列値は,DOMのnodeValue
メソッド([DOM]を参照) が返す文字列と同じではない。NOTE: For element nodes and root nodes, the string-value of a node is not the same as the string returned by the DOMnodeValue
method (see [DOM]).
幾つかのノード型は展開名ももっている。 展開名は,局所部分と名前空間URIとからなる対とする。局所部分は,文字列とする。 名前空間URIは,ヌル又は文字列のいずれかとする。XML文書の中で指定される 名前空間URIは,[RFC2396]において 定義されるURI参照とすることができる。これは,名前空間URIが素片 識別子をもつことができること及び相対的でありうることを意味する。 相対URIは,名前空間処理中に絶対URIに解決されることが望ましいので,データ モデル内のノードの展開名の名前空間URIは, 絶対的とすることが望ましい。二つの展開名は, 同一の局所部分をもつ場合であって,両者がともにヌルの名前空間URIをもつか 又は両者がともに相等しい非ヌルの名前空間URIをもつかどちらかの場合に, 等しくなる。
文書内のすべてのノードに対して定義され,一般実体展開後の文書のXML表現において, 各ノードのXML表現の最初の文字が出現する順序に対応する 文書順という順序付けがある。そこで,ルートノードは,最初のノードになる。 要素ノードは,その子どもよりも前に出現する。そこで,文書順は,要素ノードを (実体展開後の)XMLにおける開始タグの出現順序に順序付ける。要素の属性ノード及び 名前空間ノードは,要素の子どもよりも前に出現する。名前空間ノードは,属性ノードの前に 出現すると定義される。複数の名前空間ノードの相対的順序は,実装依存とする。 複数の属性ノードの相対的順序は,実装依存とする。 逆文書順は, 文書順の逆である。
ルートノード及び要素ノードは,順序付けられた子ノードリストをもつ。複数のノードが 子どもを共有することは決してない。もし,あるノードがもう一つのノードと同じでなければ, あるノードの子どもは,どれももう一つのノードの子どものどれとも同じにならない。 ルートノード以外のすべてのノードは,親をただ一つだけもち,親は要素 ノード又はルートノードのいずれかとする。ルートノード又は要素ノードは, その子ノードのそれぞれの親とする。ノードの 子孫は,ノードの子ども及びノードの子どもの子孫とする。
ルートノードは,木のルートとする。ルートノードは,木のルートとして以外は出現しない。 文書要素の要素ノードは,ルートノードの子とする。ルートノードはまた, 前書きの中及び文書要素末尾の後に出現する,処理命令及び注釈に対応する処理命令 ノード及び注釈ノードも,子どもとしてもつ。
ルートノードの文字列値は, ルートノードのすべてのテキストノード子孫の 文字列値の,文書順における連結とする。
ルートノードは,展開名をもたない。
文書内のあらゆる要素に対して要素ノードがある。要素ノードは,XML名前空間勧告 [XML Names]に従い,タグの中で指定される要素の QNameを展開して 計算される展開名をもつ。 もし,QNameが 接頭辞をもたず,適用可能なデフォルト名前空間がなければ, 要素の展開名の名前空間URIはヌルとする。
備考 [XML Names]のA.3の 記法では,展開名の局所部分は,ExpEType
要素のtype
属性に 対応する。展開名の名前空間URIは,ExpEType
要素のns
属性 に対応し,もしExpEType
要素のns
属性が省略されれば, 名前空間URIはヌルとする。NOTE: In the notation of Appendix A.3 of [XML Names], the local part of the expanded-name corresponds to thetype
attribute of theExpEType
element; the namespace URI of the expanded-name corresponds to thens
attribute of theExpEType
element, and is null if thens
attribute of theExpEType
element is omitted.
要素ノードの子どもは,その内容に関する,要素ノード,注釈ノード,処理命令ノード 及びテキストノードとする。内部実体及び外部実体のどちらへの実体参照もともに展開される。 文字参照は解決される。
要素ノードの文字列値は, 要素ノードのすべてのテキストノード子孫の 文字列値の,文書順における連結とする。
要素ノードは,一意の識別子(ID)をもってもよい。これは,DTDにおいてID
型として
宣言される属性の値である。一つの文書中のどの二つの要素も同じ一意IDをもっては
ならない。もしXMLプロセサが,一つの文書中の二つの要素が同じ一意IDをもって
いる(文書が妥当でない場合だけに可能)と報告すれば,文書順で二番目の要素は
一意IDをもたないものとして扱わなければならない。
ID
. No two elements
in a document may have the same unique ID. If an XML processor reports two
elements in a document as having the same unique ID (which is possible only if
the document is invalid) then the second element in document order must be
treated as not having a unique ID.
備考 もし文書がDTDをもたなければ,文書中のどの要素も一意IDをもたない ことになる。NOTE: If a document does not have a DTD, then no element in the document will have a unique ID.
各要素ノードは,関連付けられた属性ノードの集合をもち,要素は,これらの属性ノード それぞれの親とする。ただし,属性ノードは,親である要素 の子とはしない。
備考 これはDOMとは異なる。DOMは,属性をもつ要素を属性の親としては 扱わない([DOM]を参照)。NOTE: This is different from the DOM, which does not treat the element bearing an attribute as the parent of the attribute (see [DOM]).
複数の要素が属性ノードを共有することは決してない。もし,ある要素ノードが もう一つの要素ノードと同じノードでなければ,ある要素ノードの属性ノードはどれも, もう一つの要素ノードの属性ノードと同じノードにならない。
備考=
演算子は,二つのノードが同じ値をもつかどうかを テストし,それらが同じノードであるかどうかはテストしない。そこで, 二つの異なる要素の属性は,たとえそれらが同じノードでなくとも,=
を使用して等しいかどうか比較してよい。NOTE: The=
operator tests whether two nodes have the same value, not whether they are the same node. Thus attributes of two different elements may compare as equal using=
, even though they are not the same node.
デフォルトにされた属性も指定された属性と同一に扱われる。もし,ある属性が
DTD内でその要素型について宣言されたが,デフォルトが#IMPLIED
と宣言され,しかもその属性がその要素に関して指定されなかった場合には,
その要素の属性集合はその属性に対するノードを含まない。
#IMPLIED
, and the attribute was not specified on the
element, then the element's attribute set does not contain a node for the
attribute.
xml:lang
,xml:space
などの属性は,別の子孫
要素上の同じ属性のインスタンスで上書きされなければ,その属性がその属性を有する
要素の子孫であるすべての要素に適用されるセマンティクスをもつ。
しかし,これは,属性ノードが木の中のどこに現れるかに影響しない。
要素は,その要素の開始タグ若しくは空要素タグにおいて明示的に指定された属性,
又はDTDにおいてデフォルト値つきで明示的に宣言された属性だけに対して,
属性ノードをもつ。
xml:lang
and xml:space
,
have the semantics that they apply to all elements that are descendants of the
element bearing the attribute, unless overridden with an instance of the same
attribute on another descendant element. However, this does not affect where
attribute nodes appear in the tree: an element has attribute nodes only for
attributes that were explicitly specified in the start-tag or empty-element tag
of that element or that were explicitly declared in the DTD with a default
value.
属性ノードは,展開名及び 文字列値とをもつ。 展開名は,XML名前空間勧告 [XML Names]に従い,XML文書中のタグで 指定されるQName を展開して計算される。属性名の名前空間URIは,もしその属性の QNameが 接頭辞をもたなければ,ヌルになる。
備考 [XML Names]のA.3の 記法では,展開名の局所部分はExpAName
要素のname
属性 に対応する。展開名の名前空間URIは,ExpAName
要素のns
属性に対応し,もしExpAName
要素のns
属性が省略されれば, ヌルとする。NOTE: In the notation of Appendix A.3 of [XML Names], the local part of the expanded-name corresponds to thename
attribute of theExpAName
element; the namespace URI of the expanded-name corresponds to thens
attribute of theExpAName
element, and is null if thens
attribute of theExpAName
element is omitted.
属性ノードは,文字列値をもつ。 文字列値は,XML勧告[XML] によって指定される,正規化された値である。正規化された値が長さ0の文字列である 属性も,特別扱いされず,文字列値が 長さ0の文字列である属性ノードとなるだけである。
備考 デフォルト属性が,外部DTD又は外部パラメタ実体の中で宣言されている こともある。XML勧告は,XMLプロセサに対して,それが妥当性検証しているのでなければ, 外部DTD又は外部パラメタを読むことを要求しない。外部DTD又は外部パラメタ実体 で宣言されたデフォルト属性値をXPath木が含むことを前提とするスタイルシートなどは, 妥当性検証を行わないXMLプロセサと共に動作しなくてもよい。NOTE: It is possible for default attributes to be declared in an external DTD or an external parameter entity. The XML Recommendation does not require an XML processor to read an external DTD or an external parameter unless it is validating. A stylesheet or other facility that assumes that the XPath tree contains default attribute values declared in an external DTD or parameter entity may not work with some non-validating XML processors.
名前空間を宣言する属性([XML Names]を参照)に 対応する属性ノードはない。
各要素は,関連付けられた名前空間ノードの集合をもつ。要素の有効範囲内にある
明示された名前空間接頭辞(XML名前空間勧告[XML Names]
によって暗黙に宣言される,xml
接頭辞を含む)それぞれに対して
一つと,もしデフォルト名前空間が要素の有効範囲内にあれば,それに対して
一つとする。要素は,これらの名前空間ノードそれぞれの親
とするが,名前空間ノードは親である要素の子とはしない。複数の要素が
名前空間ノードを共有することは決してない。もし,ある要素ノードが
もう一つの要素ノードと同じでなければ,ある要素ノードの名前空間ノードは,
どれももう一つの要素ノードの名前空間ノードと同じにならない。このことは,
要素が次の属性に対して名前空間ノードをもつということを意味している。
xml
prefix, which is implicitly declared by the XML Namespaces
Recommendation [XML Names])
and one for the default namespace if one is in scope for the element. The
element is the parent of each
of these namespace nodes; however, a namespace node is not a child of its parent
element. Elements never share namespace nodes: if one element node is not the
same node as another element node, then none of the namespace nodes of the one
element node will be the same node as the namespace nodes of another element
node. This means that an element will have a namespace node:
名前がxmlns:
で始まる要素上のあらゆる属性
xmlns:
;
もしその要素自身又はより近い祖先がその接頭辞を再宣言していなければ,名前が
xmlns:
で始まる祖先要素上のあらゆる属性
xmlns:
unless the element itself or a nearer ancestor redeclares
the prefix;
もしその要素又は祖先がxmlns
属性をもち,かつ直近のそのような
要素のxmlns
属性の値が空でなければ,xmlns
属性
xmlns
attribute, if the element or some ancestor has an
xmlns
attribute, and the value of the xmlns
attribute for the nearest such element is non-empty
備考xmlns=""
属性は,デフォルト名前空間の“取消を宣言する” ([XML Names]を参照)。NOTE: An attributexmlns=""
"undeclares" the default namespace (see [XML Names]).
名前空間ノードは,展開名をもつ。局所部分は, 名前空間接頭辞とし(これは,名前空間ノードがデフォルト名前空間に対するもの であれば,空である),名前空間URIは,常にヌルとする。
名前空間ノードの文字列値は,その名前空間 接頭辞に結合されている名前空間URIである。もしそれが相対URIであれば, 展開名における名前空間URIのように, 解決していなければならない。
文書型宣言内部に出現する処理命令を除いて,あらゆる処理命令に対応して 処理命令ノードがある。
処理命令は,展開名をもつ。局所部分は,
処理命令のターゲットであり,名前空間URIはヌルである。処理命令ノードの
文字列値は,処理命令の,ターゲットと
空白に引き続く部分とする。終了の?>
は含まない。
?>
.
備考 XML宣言は,処理命令とはしない。したがって,XML宣言に対応する 処理命令ノードはないものとする。NOTE: The XML declaration is not a processing instruction. Therefore, there is no processing instruction node corresponding to the XML declaration.
文書型宣言内部に出現する注釈を除いて,あらゆる注釈に対して注釈ノードがある。
注釈の文字列値は,開きの<!--
又は閉じの-->
を含まない,注釈の内容である。
<!--
or the closing -->
.
注釈ノードは,展開名をもたない。
文字データは,テキストノードにまとめられる。できるだけ多くの文字データが 各テキストノード内にまとめられる。テキストノードは,直前又は直後にテキスト ノードの兄弟をもつことはない。テキストノードの 文字列値は,文字データとする。 テキストノードは必ず少なくとも1文字のデータをもつ。
CDATAセクション内にある各文字は,文字データとして扱われる。そのため,
ソース文書内の <![CDATA[<]]>
は
<
と同じに扱われる。両者ともに,木のテキスト
ノードでは1個の <
文字となる。そのため,CDATAセクション
は,<![CDATA[
及び]]>
が除去され,
<
及び&
の出現がそれぞれ
<
及び&
で置き換えられたかの
ように扱われる。
<![CDATA[<]]>
in the source document will treated the same
as <
. Both will result in a single <
character in a text node in the tree. Thus, a CDATA section is treated as if the
<![CDATA[
and ]]>
were removed and every
occurrence of <
and &
were replaced by
<
and &
respectively.
備考<
文字を含むテキストノードがXMLとして書き出される とき,<
文字は,例えば,<
を使ったり, 又はCDATAセクションの中に含めるなどして,別扱いしなければならない。NOTE: When a text node that contains a<
character is written out as XML, the<
character must be escaped by, for example, using<
, or including it in a CDATA section.
注釈,処理命令,属性値の内部の文字は,テキストノードを生成しない。 外部実体内の行末は,XML勧告[XML]で指定されるように #xAに正規化される。
テキストノードは,展開名をもたない。
XPathは,主に,他の規定で使用できる構成要素として意図されている。 したがって,XPathの実装の適合性のための判定基準を示すには, ([XPointer]及び[XSLT]のような)XPathを 使用する規定に左右されることになるので, XPathの独立した実装のための適合性判定基準を定義することはしない。