標準情報(TR)    TR X 0089:2003


XMLパス言語 (XPath) 1.0

XML Path Language (XPath) Version 1.0



序文

この標準情報(TR)は, 1999年11月にWorld Wide Web Consortium(W3C)から公表されたXML Path Language (XPath) Version 1.0 勧告を翻訳し, 技術的内容を変更することなく作成した標準情報(TR)である。



0. 適用範囲

XPathは, XML文書の部分を番地付けするための言語であり, XSLT及びXPointerの両者によって用いられる設計となっている。

1. 導入

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ソースの中で<として現れてはならず, 例えば&lt;としてそれを入れることによって, XML 1.0の規則に従って引用されなければならない。式の中では, リテラル列は, 1重引用符又は2重引用符によって区切られるが, それらは, XML属性を区切るのにも使われる。式の中の引用符が, XMLプロセサによって属性値を終端していると解釈されることを避けるため, 引用符は, 文字参照(&quot;又は&apos;)として入れることができる。これに代えて, XML属性が2重引用符で区切られているときには, 式は1重引用符を使うことができ, その逆もできる。

重要な種類の式の一つに, 位置パスがある。位置パスは, 文脈ノードに対して相対的にノードの集合を選ぶ。位置パスである式を評価した結果は, その位置パスによって選ばれるノードを含むノード集合とする。位置パスは, ノードの集合をフィルタリングするのに使われる式を再帰的に含むことができる。位置パスは, 生成規則LocationPathに一致する。

次の文法において, 非終端記号のQName及びNCNameは, [XML Names]で定義され, Sは, [XML]で定義される。文法は, [XML]と同じEBNF記法を用いる。(文法の記号が常に先頭の大文字をもつことを除く。)

式は, まず解析対象の文字列をトークンに分割し, それから結果のトークン列を解析することによって, 構文解析される。トークンの間には空白を自由に使うことができる。トークン化処理は, [3.7 字句構造]において示す。

2. 局所パス

位置パスは, 言語の中で最も一般的な文法的構成子ではない(LocationPathは, Exprの特別な場合である。)が, 最も重要な構成子なので, 最初にそれを示す。

位置パスはどれも, 直接的ではあるが少しばかり面倒な構文を使って表わせる。共通のケースを簡潔に表わせる多くの構文的短縮形もある。2.は, 非短縮構文を使って, 位置パスのセマンティクスを説明する。その後で短縮構文は, それがどのように非短縮構文に展開するかを示すことによって説明される([2.5 短縮構文]を参照)。

ここでは, 非短縮構文を使った位置パスの例を示す。

位置パスには, 相対位置パス及び絶対位置パスの2種類がある。

相対位置パスは, / で分離された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部分をもつ。

位置ステップの構文は, 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

2.2 軸

次に示す軸が利用できる。

備考  ancestor, descendant, following, preceding及びselfの軸は, (属性ノード及び名前空間ノードを無視して)文書を区分する。これらは重畳せず, 一緒に文書中のすべてのノードを含む。
[6]    AxisName    ::=    'ancestor'
| 'ancestor-or-self'
| 'attribute'
| 'child'
| 'descendant'
| 'descendant-or-self'
| 'following'
| 'following-sibling'
| 'namespace'
| 'parent'
| 'preceding'
| 'preceding-sibling'
| 'self'

2.3 ノード試験

どの軸にも主ノード型がある。軸が要素を含むことができるとき, 主ノード型は要素となる。そうではないときは, 軸が含むことができるノードの型になる。そこで, 次のとおりとなる。

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 ')'

2.4 述部

軸は, 順方向軸か逆方向軸かのどちらかとする。文脈ノード, 又は文書順に文脈ノードの後にあるノードだけしか含まない軸は, 順方向軸とする。文脈ノード, 又は文書順に文脈ノードの前にあるノードだけしか含まない軸は, 逆方向軸とする。そこで, 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

2.5 短縮構文

短縮構文を使った位置パスの例を次に示す。

最も重要な短縮形は, 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    ::=    '@'?

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 ノード集合型(node-set)

位置パスは,式として使用できる。その式は,パスによって選択されるノードの集合を返す。

| 演算子は,そのオペランドの和集合を計算するが,オペランドは,ノード集合でなければならない。

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

3.4 論理型(boolean)

論理型のオブジェクトは,二つの値,真(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の規則に従って,例えば,&lt; 及び &lt;= を用いて引用されなければならない。次の例では,test 属性の値が,XPath式になっている。
<xsl:if test="@value &lt; 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
備考 この文法の効果は,次に示す優先順位の順序による。優先順位の順序は,より低い優先順位のものを先に示してある。
さらに,演算子は,すべて,左結合とする。例えば,3 > 2 > 1 は,(3 > 2) > 1 と等価であって,偽と評価される。

3.5 数値型(number)

数値は,浮動小数点数値を表現する。数値は,倍精度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)除算からの剰余を返す。次に例を示す。

備考 これは,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

3.6 文字列型(string)

文字列は,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]を参照すること。

3.7 字句構造

トークン化を行う場合,最も長い可能なトークンが常に返される。

読みやすさのために,空白は,文法によって明示的に許されない場合であっても,式の中で使用してもよい。すなわち,ExprWhitespaceを,ExprTokenの前後のパタン内に自由に追加してもよい。

ExprToken文法をあいまいにしないために,次の特殊なトークン化規則を指定された順序で適用しなければならない。

式の字句構造
[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. コア関数ライブラリ

4.は,XPath実装が式を評価するために使用する関数ライブラリの中に常に含めなければならない関数を記述する。

関数ライブラリの中の各関数は,関数の原型(prototype)を用いて指定される。この原型は,返却型,関数の名前及び引数型を与える。引数型の後に疑問符("?")がある場合には,その引数はオプションとする。そうでない場合には,引数は必須とする。

4.1 ノード集合関数

関数 数値型 last()

last関数は,式評価文脈から文脈サイズに等しい数値を返す。

関数 数値型 position()

position関数は,式評価文脈から文脈位置に等しい数値を返す。

関数 数値型 count(ノード集合型 )

count関数は,引数であるノード集合の中のノードの数を返す。

関数 ノード集合型 id(オブジェクト型 )

id関数は,一意ID([5.2.1 一意ID]参照)によって要素を選択する。idへの引数がノード集合型の場合,結果は,引数であるノード集合の中の各々のノードの文字列値idを適用した結果の和集合とする。idへの引数がそれ以外の型の場合,その引数は,string関数への呼出しによるものとして文字列に変換される。その文字列は,トークンの空白で区切られたリストに分けられる。空白は,生成規則Sにマッチする文字の列とする。結果は,リストの中のトークンに等しい一意IDをもつ文脈ノードと同じ文書の中の要素を含むノード集合とする。

関数 文字列型 local-name(ノード集合型 ?)

local-name関数は,引数であるノード集合の中の文書順で最初のノードの展開名の局所部分を返す。引数のノード集合が空か,又は最初のノードが展開名をもたない場合には,空文字列が返される。引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。

関数 文字列型 namespace-uri(ノード集合型 ?)

namespace-uri関数は,引数であるノード集合の中の文書順で最初のノードの展開名の名前空間URIを返す。引数のノード集合が空,最初のノードが展開名をもたない,又は展開名の名前空間URIがヌルの場合には,空文字列が返される。引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。

備考 namespace-uri関数が返す文字列は,要素ノード及び属性ノードについて以外は空になる。

関数 文字列型 name(ノード集合型 ?)

name関数は,引数であるノード集合の中の文書順で最初のノードの展開名を表現するQNameを含む文字列を返す。QNameは,展開名が表現されているノード上で実効的な名前空間宣言に関して,その展開名を表現しなければならない。通常は,これは,XMLソースに出現したQNameになる。そのノード上に複数の接頭辞を同じ名前空間に関連付ける複数の名前空間宣言が存在する場合には,そうなる必要はない。しかし,実装は,ノードのその表現に元々の接頭辞についての情報を含めてもよい。この場合,実装は,返される文字列が常にXMLソースの中で使用されているQNameと確実に同じにできる。引数であるノード集合が空か,又は最初のノードが展開名をもたない場合,空文字列が返される。引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。

備考 name関数が返す文字列は,要素ノード及び属性ノードについて以外は,local-name関数が返す文字列と同じになる。

4.2 文字列型関数

関数 文字列型 string(オブジェクト型 ?)

string関数は,次のとおりに,オブジェクトを文字列に変換する。

引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。

備考 string 関数は,利用者への表示のために数値を文字列に変換することを意図していない。[XSLT]における format-number 関数及び xsl:number 要素が,この機能を提供する。

関数 文字列型 concat(文字列型, 文字列型, 文字列型 *)

concat関数は,その引数の(文字列の)連結を返す。

関数 論理型 starts-with(文字列型, 文字列型 )

starts-with関数は,最初の引数の文字列が2番目の文字列の引数で開始する場合に,真を返す。そうでない場合に,偽を返す。

関数 論理型 contains(文字列型, 文字列型 )

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関数の呼出しによるものとして行われる。次の例は,さまざまな通常ではない場合を示す。

関数 数値型 string-length(文字列型 ?)

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の将来の版は,大文字・小文字の変換のための追加関数を提供するかもしれない。

4.3 論理型関数

関数 論理型 boolean(オブジェクト型 )

boolean関数は,次のとおりに,その引数を論理型に変換する。

関数 論理型 not(論理型 )

not関数は,その引数が偽の場合に真を返し,そうでない場合に偽を返す。

関数 論理型 true()

true関数は,真を返す。

関数 論理型 false()

false関数は,偽を返す。

関数 論理型 lang(文字列型 )

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"/>

4.4 数値型関数

関数 数値型 number(オブジェクト型 ?)

number関数は,次のとおりに,その引数を数値に変換する。

引数が省略された場合には,文脈ノードを唯一のメンバとするノード集合をデフォルトとする。

備考 number関数は,XML文書の中の要素が言語中立のフォーマットで数値データを表現する型になっていない場合,その要素に出現する数値データを変換するために使用しないほうがよい。(言語中立のフォーマットの数値データは,通常は,利用者に表示するために言語特有のフォーマットに変換される。) さらに,number関数は,その要素が使用する言語中立のフォーマットがNumberのためのXPath構文と矛盾する場合には,使用できない。

関数 数値型 sum(ノード集合型 )

sum関数は,引数のノード集合の中の各ノードに対して,そのノードの文字列値を数値に変換した結果の合計を返す。

関数 数値型 floor(数値型 )

floor関数は,その引数より大きくなく整数である最大の(正の無限大に最も近い)数値を返す。

関数 数値型 ceiling(数値型 )

ceiling関数は,その引数より小さくなく整数である最小の(負の無限大に最も近い)数値を返す。

関数 数値型 round(数値型 )

round関数は,その引数に最も近い整数の数値を返す。そのような二つの数値が存在する場合には,正の無限大に最も近いものを返す。引数がNaNの場合には,NaNを返す。引数が正の無限大の場合には,正の無限大を返す。引数が負の無限大の場合には,負の無限大を返す。引数が正の0の場合には,正の0を返す。引数が負の0の場合には,負の0を返す。引数が0よりも小さいが,-0.5以上の場合には,負の0を返す。

備考 これらの最後の二つの場合については,round関数を呼び出した結果は,0.5を加えてその次にfloor関数を呼び出した結果と同じではない。
XML Path Language (XPath)

5. データモデル

XPathは,木としてのXML文書を操作する。5.では,どのようにしてXPathが XML文書を木としてモデル化するかを記述する。このモデルは,単に概念的なもので あり,何らかの特別な実装を強制するわけではない。このモデルの,XML情報集合 [XML Infoset] に対する関係は, [B. XML情報集合との対応付け] において記述される。

XPath operates on an XML document as a tree. This section describes how XPath models an XML document as a tree. This model is conceptual only and does not mandate any particular implementation. The relationship of this model to the XML Information Set [XML Infoset] is described in [B. XML情報集合との対応付け].

XPathによって操作されるXML文書は,XML名前空間勧告 [XML Names]に適合しなければならない。

XML documents operated on by XPath must conform to the XML Namespaces Recommendation [XML Names].

木はノードを含む。ノードには次の七つの型がある。

The tree contains nodes. There are seven types of node:

すべてのノード型に対して,その型のノードに対する文字列値を決定する方法がある。 あるノード型に対しては,文字列値はノードの一部とし,別のノード型に対しては, 文字列値は子孫ノードの文字列値から計算される。

For every type of node, there is a way of determining a string-value for a node of that type. For some types of node, the string-value is part of the node; for other types of node, the string-value is computed from the string-value of descendant nodes.

備考 要素ノード及びルートノードの場合は,ノードの文字列値は,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 DOM nodeValue method (see [DOM]).

幾つかのノード型は展開名ももっている。 展開名は,局所部分と名前空間URIとからなる対とする。局所部分は,文字列とする。 名前空間URIは,ヌル又は文字列のいずれかとする。XML文書の中で指定される 名前空間URIは,[RFC2396]において 定義されるURI参照とすることができる。これは,名前空間URIが素片 識別子をもつことができること及び相対的でありうることを意味する。 相対URIは,名前空間処理中に絶対URIに解決されることが望ましいので,データ モデル内のノードの展開名の名前空間URIは, 絶対的とすることが望ましい。二つの展開名は, 同一の局所部分をもつ場合であって,両者がともにヌルの名前空間URIをもつか 又は両者がともに相等しい非ヌルの名前空間URIをもつかどちらかの場合に, 等しくなる。

Some types of node also have an expanded-name, which is a pair consisting of a local part and a namespace URI. The local part is a string. The namespace URI is either null or a string. The namespace URI specified in the XML document can be a URI reference as defined in [RFC2396]; this means it can have a fragment identifier and can be relative. A relative URI should be resolved into an absolute URI during namespace processing: the namespace URIs of expanded-names of nodes in the data model should be absolute. Two expanded-names are equal if they have the same local part, and either both have a null namespace URI or both have non-null namespace URIs that are equal.

文書内のすべてのノードに対して定義され,一般実体展開後の文書のXML表現において, 各ノードのXML表現の最初の文字が出現する順序に対応する 文書順という順序付けがある。そこで,ルートノードは,最初のノードになる。 要素ノードは,その子どもよりも前に出現する。そこで,文書順は,要素ノードを (実体展開後の)XMLにおける開始タグの出現順序に順序付ける。要素の属性ノード及び 名前空間ノードは,要素の子どもよりも前に出現する。名前空間ノードは,属性ノードの前に 出現すると定義される。複数の名前空間ノードの相対的順序は,実装依存とする。 複数の属性ノードの相対的順序は,実装依存とする。 逆文書順は, 文書順の逆である。

There is an ordering, document order, defined on all the nodes in the document corresponding to the order in which the first character of the XML representation of each node occurs in the XML representation of the document after expansion of general entities. Thus, the root node will be the first node. Element nodes occur before their children. Thus, document order orders element nodes in order of the occurrence of their start-tag in the XML (after expansion of entities). The attribute nodes and namespace nodes of an element occur before the children of the element. The namespace nodes are defined to occur before the attribute nodes. The relative order of namespace nodes is implementation-dependent. The relative order of attribute nodes is implementation-dependent. Reverse document order is the reverse of document order.

ルートノード及び要素ノードは,順序付けられた子ノードリストをもつ。複数のノードが 子どもを共有することは決してない。もし,あるノードがもう一つのノードと同じでなければ, あるノードの子どもは,どれももう一つのノードの子どものどれとも同じにならない。 ルートノード以外のすべてのノードは,をただ一つだけもち,親は要素 ノード又はルートノードのいずれかとする。ルートノード又は要素ノードは, その子ノードのそれぞれの親とする。ノードの 子孫は,ノードの子ども及びノードの子どもの子孫とする。

Root nodes and element nodes have an ordered list of child nodes. Nodes never share children: if one node is not the same node as another node, then none of the children of the one node will be the same node as any of the children of another node. Every node other than the root node has exactly one parent, which is either an element node or the root node. A root node or an element node is the parent of each of its child nodes. The descendants of a node are the children of the node and the descendants of the children of the node.

5.1 ルートノード

ルートノードは,木のルートとする。ルートノードは,木のルートとして以外は出現しない。 文書要素の要素ノードは,ルートノードの子とする。ルートノードはまた, 前書きの中及び文書要素末尾の後に出現する,処理命令及び注釈に対応する処理命令 ノード及び注釈ノードも,子どもとしてもつ。

The root node is the root of the tree. A root node does not occur except as the root of the tree. The element node for the document element is a child of the root node. The root node also has as children processing instruction and comment nodes for processing instructions and comments that occur in the prolog and after the end of the document element.

ルートノードの文字列値は, ルートノードのすべてのテキストノード子孫文字列値の,文書順における連結とする。

The string-value of the root node is the concatenation of the string-values of all text node descendants of the root node in document order.

ルートノードは,展開名をもたない。

The root node does not have an expanded-name.

5.2 要素ノード

文書内のあらゆる要素に対して要素ノードがある。要素ノードは,XML名前空間勧告 [XML Names]に従い,タグの中で指定される要素の QNameを展開して 計算される展開名をもつ。 もし,QNameが 接頭辞をもたず,適用可能なデフォルト名前空間がなければ, 要素の展開名の名前空間URIはヌルとする。

There is an element node for every element in the document. An element node has an expanded-name computed by expanding the QName of the element specified in the tag in accordance with the XML Namespaces Recommendation [XML Names]. The namespace URI of the element's expanded-name will be null if the QName has no prefix and there is no applicable default namespace.

備考 [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 the type attribute of the ExpEType element; the namespace URI of the expanded-name corresponds to the ns attribute of the ExpEType element, and is null if the ns attribute of the ExpEType element is omitted.

要素ノードの子どもは,その内容に関する,要素ノード,注釈ノード,処理命令ノード 及びテキストノードとする。内部実体及び外部実体のどちらへの実体参照もともに展開される。 文字参照は解決される。

The children of an element node are the element nodes, comment nodes, processing instruction nodes and text nodes for its content. Entity references to both internal and external entities are expanded. Character references are resolved.

要素ノードの文字列値は, 要素ノードのすべてのテキストノード子孫文字列値の,文書順における連結とする。

The string-value of an element node is the concatenation of the string-values of all text node descendants of the element node in document order.

5.2.1 一意ID

要素ノードは,一意の識別子(ID)をもってもよい。これは,DTDにおいてID型として 宣言される属性の値である。一つの文書中のどの二つの要素も同じ一意IDをもっては ならない。もしXMLプロセサが,一つの文書中の二つの要素が同じ一意IDをもって いる(文書が妥当でない場合だけに可能)と報告すれば,文書順で二番目の要素は 一意IDをもたないものとして扱わなければならない。

An element node may have a unique identifier (ID). This is the value of the attribute that is declared in the DTD as type 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.

5.3 属性ノード

各要素ノードは,関連付けられた属性ノードの集合をもち,要素は,これらの属性ノード それぞれのとする。ただし,属性ノードは,親である要素 の子とはしない。

Each element node has an associated set of attribute nodes; the element is the parent of each of these attribute nodes; however, an attribute node is not a child of its parent element.

備考 これは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]).

複数の要素が属性ノードを共有することは決してない。もし,ある要素ノードが もう一つの要素ノードと同じノードでなければ,ある要素ノードの属性ノードはどれも, もう一つの要素ノードの属性ノードと同じノードにならない。

Elements never share attribute nodes: if one element node is not the same node as another element node, then none of the attribute nodes of the one element node will be the same node as the attribute nodes of another element node.

備考 =演算子は,二つのノードが同じ値をもつかどうかを テストし,それらが同じノードであるかどうかはテストしない。そこで, 二つの異なる要素の属性は,たとえそれらが同じノードでなくとも, =を使用して等しいかどうか比較してよい。
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 と宣言され,しかもその属性がその要素に関して指定されなかった場合には, その要素の属性集合はその属性に対するノードを含まない。

A defaulted attribute is treated the same as a specified attribute. If an attribute was declared for the element type in the DTD, but the default was declared as #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:langxml:spaceなどの属性は,別の子孫 要素上の同じ属性のインスタンスで上書きされなければ,その属性がその属性を有する 要素の子孫であるすべての要素に適用されるセマンティクスをもつ。 しかし,これは,属性ノードが木の中のどこに現れるかに影響しない。 要素は,その要素の開始タグ若しくは空要素タグにおいて明示的に指定された属性, 又はDTDにおいてデフォルト値つきで明示的に宣言された属性だけに対して, 属性ノードをもつ。

Some attributes, such as 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が 接頭辞をもたなければ,ヌルになる。

An attribute node has an expanded-name and a string-value. The expanded-name is computed by expanding the QName specified in the tag in the XML document in accordance with the XML Namespaces Recommendation [XML Names]. The namespace URI of the attribute's name will be null if the QName of the attribute does not have a prefix.

備考 [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 the name attribute of the ExpAName element; the namespace URI of the expanded-name corresponds to the ns attribute of the ExpAName element, and is null if the ns attribute of the ExpAName element is omitted.

属性ノードは,文字列値をもつ。 文字列値は,XML勧告[XML] によって指定される,正規化された値である。正規化された値が長さ0の文字列である 属性も,特別扱いされず,文字列値が 長さ0の文字列である属性ノードとなるだけである。

An attribute node has a string-value. The string-value is the normalized value as specified by the XML Recommendation [XML]. An attribute whose normalized value is a zero-length string is not treated specially: it results in an attribute node whose string-value is a zero-length string.

備考 デフォルト属性が,外部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]を参照)に 対応する属性ノードはない。

There are no attribute nodes corresponding to attributes that declare namespaces (see [XML Names]).

5.4 名前空間ノード

各要素は,関連付けられた名前空間ノードの集合をもつ。要素の有効範囲内にある 明示された名前空間接頭辞(XML名前空間勧告[XML Names] によって暗黙に宣言される,xml接頭辞を含む)それぞれに対して 一つと,もしデフォルト名前空間が要素の有効範囲内にあれば,それに対して 一つとする。要素は,これらの名前空間ノードそれぞれの とするが,名前空間ノードは親である要素の子とはしない。複数の要素が 名前空間ノードを共有することは決してない。もし,ある要素ノードが もう一つの要素ノードと同じでなければ,ある要素ノードの名前空間ノードは, どれももう一つの要素ノードの名前空間ノードと同じにならない。このことは, 要素が次の属性に対して名前空間ノードをもつということを意味している。

Each element has an associated set of namespace nodes, one for each distinct namespace prefix that is in scope for the element (including the 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:

名前空間ノードは,展開名をもつ。局所部分は, 名前空間接頭辞とし(これは,名前空間ノードがデフォルト名前空間に対するもの であれば,空である),名前空間URIは,常にヌルとする。

A namespace node has an expanded-name: the local part is the namespace prefix (this is empty if the namespace node is for the default namespace); the namespace URI is always null.

名前空間ノードの文字列値は,その名前空間 接頭辞に結合されている名前空間URIである。もしそれが相対URIであれば, 展開名における名前空間URIのように, 解決していなければならない。

The string-value of a namespace node is the namespace URI that is being bound to the namespace prefix; if it is relative, it must be resolved just like a namespace URI in an expanded-name.

5.5 処理命令ノード

文書型宣言内部に出現する処理命令を除いて,あらゆる処理命令に対応して 処理命令ノードがある。

There is a processing instruction node for every processing instruction, except for any processing instruction that occurs within the document type declaration.

処理命令は,展開名をもつ。局所部分は, 処理命令のターゲットであり,名前空間URIはヌルである。処理命令ノードの 文字列値は,処理命令の,ターゲットと 空白に引き続く部分とする。終了の?>は含まない。

A processing instruction has an expanded-name: the local part is the processing instruction's target; the namespace URI is null. The string-value of a processing instruction node is the part of the processing instruction following the target and any whitespace. It does not include the terminating ?>.

備考 XML宣言は,処理命令とはしない。したがって,XML宣言に対応する 処理命令ノードはないものとする。
NOTE: The XML declaration is not a processing instruction. Therefore, there is no processing instruction node corresponding to the XML declaration.

5.6 注釈ノード

文書型宣言内部に出現する注釈を除いて,あらゆる注釈に対して注釈ノードがある。

There is a comment node for every comment, except for any comment that occurs within the document type declaration.

注釈の文字列値は,開きの<!-- 又は閉じの-->を含まない,注釈の内容である。

The string-value of comment is the content of the comment not including the opening <!-- or the closing -->.

注釈ノードは,展開名をもたない。

A comment node does not have an expanded-name.

5.7 テキストノード

文字データは,テキストノードにまとめられる。できるだけ多くの文字データが 各テキストノード内にまとめられる。テキストノードは,直前又は直後にテキスト ノードの兄弟をもつことはない。テキストノードの 文字列値は,文字データとする。 テキストノードは必ず少なくとも1文字のデータをもつ。

Character data is grouped into text nodes. As much character data as possible is grouped into each text node: a text node never has an immediately following or preceding sibling that is a text node. The string-value of a text node is the character data. A text node always has at least one character of data.

CDATAセクション内にある各文字は,文字データとして扱われる。そのため, ソース文書内の <![CDATA[<]]>&lt; と同じに扱われる。両者ともに,木のテキスト ノードでは1個の < 文字となる。そのため,CDATAセクション は,<![CDATA[及び]]>が除去され, <及び&の出現がそれぞれ &lt;及び&amp;で置き換えられたかの ように扱われる。

Each character within a CDATA section is treated as character data. Thus, <![CDATA[<]]> in the source document will treated the same as &lt;. 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 &lt; and &amp; respectively.

備考 <文字を含むテキストノードがXMLとして書き出される とき,< 文字は,例えば,&lt; を使ったり, 又はCDATAセクションの中に含めるなどして,別扱いしなければならない。
NOTE: When a text node that contains a < character is written out as XML, the < character must be escaped by, for example, using &lt;, or including it in a CDATA section.

注釈,処理命令,属性値の内部の文字は,テキストノードを生成しない。 外部実体内の行末は,XML勧告[XML]で指定されるように #xAに正規化される。

Characters inside comments, processing instructions and attribute values do not produce text nodes. Line-endings in external entities are normalized to #xA as specified in the XML Recommendation [XML].

テキストノードは,展開名をもたない。

A text node does not have an expanded-name.

6. 適合性

XPathは,主に,他の規定で使用できる構成要素として意図されている。 したがって,XPathの実装の適合性のための判定基準を示すには, ([XPointer]及び[XSLT]のような)XPathを 使用する規定に左右されることになるので, XPathの独立した実装のための適合性判定基準を定義することはしない。

XPath is intended primarily as a component that can be used by other specifications. Therefore, XPath relies on specifications that use XPath (such as [XPointer] and [XSLT]) to specify criteria for conformance of implementations of XPath and does not define any conformance criteria for independent implementations of XPath.