訳注: この文書はhttp://www.w3.org/TR/2006/CR-xpath20-20060608/を国島丈生(kunishi@acm.org)が訳したものです。この日本語訳はあくまで参考であり、また翻訳には誤りが含まれる可能性があります。ご利用は自己責任でお願いします。一部に翻訳未完成の部分が含まれている場合があります。
This document is also available in these non-normative formats: XML and Recent revisions.
Copyright © 2006 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark and document use rules apply.
XPath 2.0は[XQuery/XPath Data Model (XDM)]で定義されるデータモデルに適合する値を処理できる式言語で ある。そのデータモデルはXML文書の木表現を提供し、その他に、整数、文字列、 ブール値といった原子値や、XML文書中の節点への参照や原子値からなる列を提 供する。XPath式の結果は、入力文書から選択された節点、原子値、または、さ らに一般的に言えば、データモデルで許される任意の列である。この言語の名 前は、最も特徴的な機能である経路式(path expression)に由来している。経路 式はXML木中の節点の階層的な位置を表す手段を提供する。 XPath 2.0は[XPath 1.0]の上位互換になっており、XPath 1.0に、よ り豊富なデータ型の支援、文書がXML Schemaを用いて妥当性検証されるときに 有効になる型情報の利用などの機能を加えている。ほとんどすべてのXPath 1.0式について、XPath 2.0でも引き続き同じ結果を得ることを保証するために、 後方互換性モードを提供する。この方針に関する例外を[I XPath 1.0 との後方互換性]に記している。
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
On 3 November 2005, this specification was published as a Candidate Recommendation, and a Call for Implementations was announced. This revision is published in order to give visibility to the technical decisions that have been made so far during this phase of the process and to allow review by W3C Members and other interested parties. The maturity level of the specification remains unchanged, and the work is on track to move forward to the Proposed Recommendation stage when the exit criteria for the current phase have been met.
Publication as a Candidate Recommendation does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress. This specification will remain a Candidate Recommendation until at least 28 February 2006.
The XPath and XML Query Test Suite is under development. Implementors are encouraged to run this test suite and report their results.
This document was jointly produced by the XML Query Working Group and the XSL Working Group, both of which are part of the XML Activity.
This draft includes corrections and changes based on public comments recorded in the W3C public Bugzilla repository (http://www.w3.org/Bugs/Public/) used for Last Call issues tracking. A list of substantive changes since the publication of the Candidate Recommendation of 03 November 2005 can be found in J Revision Log.
Comments on this document are invited and should be made in W3C's public Bugzilla system (instructions can be found at http://www.w3.org/XML/2005/04/qt-bugzilla). If access to that system is not feasible, you may send your comments to the W3C XSLT/XPath/XQuery mailing list, public-qt-comments@w3.org. It will be very helpful if you include the string [XPath] in the subject line of your comment, whether made in Bugzilla or in email. Each Bugzilla entry and email message should contain only one comment. Archives of the comments and responses are available at http://lists.w3.org/Archives/Public/public-qt-comments/ .
This document was produced by groups operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the XML Query Working Group and also maintains a public list of any patent disclosures made in connection with the deliverables of the XSL Working Group; those pages also include instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) with respect to this specification should disclose the information in accordance with section 6 of the W3C Patent Policy.
1 まえがき
2 基本事項
2.1 式文脈
2.1.1 静的文脈
2.1.2 動的文脈
2.2 処理モデル
2.2.1 データモデルの生成
2.2.2 スキーマの輸入処理
2.2.3 式の処理
2.2.3.1
静的解析相
2.2.3.2
動的評価相
2.2.4 直列化
2.2.5 無矛盾性制約
2.3 エラー処理
2.3.1 エラーの種類
2.3.2 エラーの識別と報告
2.3.3 動的エラーの処理
2.3.4 エラーと最適化
2.4 概念
2.4.1 文書順
2.4.2 原子化
2.4.3 有効ブール値
2.4.4 入力源
2.5 型
2.5.1 既定義スキーマ型
2.5.2 型付けされた値と文字列値
2.5.3 SequenceTypeの文法
2.5.4 SequenceTypeの照合
2.5.4.1
SequenceTypeと値の照合
2.5.4.2
ItemTypeと項目の照合
2.5.4.3
要素テスト
2.5.4.4
スキーマ要素テスト
2.5.4.5
属性テスト
2.5.4.6
スキーマ属性テスト
2.6 コメント
3 式
3.1 基本式
3.1.1 リテラル
3.1.2 変数参照
3.1.3 括弧式
3.1.4 文脈項目式
3.1.5 関数呼び出し
3.2 経路式
3.2.1 ステップ
3.2.1.1
軸
3.2.1.2
節点テスト
3.2.2 述語
3.2.3 非省略構文
3.2.4 省略構文
3.3 列式
3.3.1 列の構成
3.3.2 選別式
3.3.3 節点列の結合
3.4 算術式
3.5 比較式
3.5.1 値比較
3.5.2 汎用比較
3.5.3 節点比較
3.6 論理式
3.7 For式
3.8 条件式
3.9 限量式
3.10 SequenceTypes上の式
3.10.1 Instance Of
3.10.2 Cast
3.10.3 Castable
3.10.4 構成子関数
3.10.5 Treat
A XPathの文法
A.1 EBNF
A.1.1 記法
A.1.2 特別な文法上の制約
A.1.3 文法に関する備考
A.2 字句構造
A.2.1 終端記号
A.2.2 終端記号の区切り
A.2.3 行末処理
A.2.3.1
XML 1.0の行末処理
A.2.3.2
XML 1.1の行末処理
A.2.4 空白規則
A.2.4.1
デフォルト空白処理
A.2.4.2
明示的空白処理
A.3 予約済関数名
A.4 優先順位
B 型の昇格と演算子の写像
B.1 型の昇格
B.2 演算子の写像
C 文脈の構成要素
C.1 静的文脈の構成要素
C.2 動的文脈の構成要素
D 実装定義の項目
E 参考文献
E.1 規格
E.2 参考
E.3 背景資料
F 適合性
F.1 静的型付け機能
F.1.1 静的型付け拡張
G エラー条件
H 用語集 (Non-Normative)
I XPath 1.0 との後方互換性
(Non-Normative)
I.1 互換モードが true のときの非互換性
I.2 互換性モードが false のときの非互換性
I.3 スキーマを用いた場合の非互換性
J Revision Log
(Non-Normative)
J.1 10 May
2006
XPathの主な目的は[XML 1.0]もしくは[XML 1.1]の木の節点を指し示すことである。 XPathの名前は、XML文書の階層的構造を巡航するのに経路記述を用いることに由来している。 XPathは簡潔な非XML記法を用い、URIやXMLの属性値中でのXPathの利用を容易にしている。
[Definition: XPathは、XML文書の抽象 的かつ論理的な構造に適用され、XML文書の表面上の構文には適用されない。こ の論理的な構造はデータモデルと呼ばれ、[XQuery/XPath Data Model (XDM)]で定義されている。]
XPathは、[XSLT 2.0]や[XQuery]などのホスト言語に埋め込めるように設計されている。XPathには、照合(節点がパターンに照合されるかどうかのテスト)に使用できる自然な部分集合がある。このXPathの使い方は[XSLT 2.0]で記述されている。
XQueryバージョン1.0はXPathバージョン2.0の拡張である。XPath2.0でもXQuery 1.0でも構文的に正しく、かつ正常に実行される式はすべて、いずれの言語でも同じ結果を返す。これらの言語は非常に密接に関連しているため、これらの言語の文法や言語記述は、一貫性を保つために共通のソースから生成されており、これらの仕様書の編者は密に協力して作業を進めている。
またXPathは、以下の仕様書に依存しており、密接に関連している。
[XQuery/XPath Data Model (XDM)]では、すべてのXPath式の基礎となるデータモデルを定義する。
[XQuery 1.0 and XPath 2.0 Formal Semantics]では、XPathの静的な意味を定義する。また動的な意味に関して、形式的ではあるが規範ではない記述を含んでいる。これは、実装を行う人や形式的定義を必要とする人に有用である。
XPathの型システムは[XML Schema]に基づいている。
XPathで支援されている組み込み関数ライブラリや演算子は[XQuery 1.0 and XPath 2.0 Functions and Operators]で定義される。
この文書は[XML 1.0]で用いられているのと同じ基本的なEBNF記法を用いて、XPathの文法を規定する。特に注釈を加えない限り(A.2 字句構造)、空白は式中では意味を持たない。文法の生成規則は、それが記述している特徴とともに紹介される。また、完全な文法は付録 [A XPathの文法]で示される。この付録は規定版である。
この文書中の文法の生成規則では、名前を持つ記号には下線を引き、リテラルテキストは二重引用符で囲む。例えば、次の生成規則は関数呼び出しの構文を記述している:
| [48] | FunctionCall |
::= | QName "(" (ExprSingle ("," ExprSingle)*)? ")" |
この生成規則は次のように読むべきである: 関数呼び出しは、一つの開き括弧が続く一つのQNameからなる。その開き括弧の次には、省略可能な引数リストが続く。引数リストは(もし存在するならば)1つ以上の式からなり、それらはコンマで区切られる。省略可能な引数リストの次には、1つの閉じ括弧が続く。
この仕様書では、言語処理のいくつかの面について、実装定義または実装依存という言葉で記述している。
[Definition: 実装定義とは、実装によって異なるかもしれないが、個々の実装に対して実装者が指定しなければならない面を表す。]
[Definition: 実装依存とは、実装によって異なるかもしれず、この仕様書やW3Cのどの仕様書でも指定されず、どの実装でも実装者が指定する必要のない面を表す。]
この仕様書で実装定義または実装依存と記述されている言語の側面は、XPathが埋め込まれているホスト言語の仕様書からさらに制限を受けるかもしれない。
この文書はXPathの動的な意味を規定として定義する。XPathの静的な意味は[XQuery 1.0 and XPath 2.0 Formal Semantics]において規定として定義されている。この文書では、例、および「Note:」というラベルの付けられた資料は説明の目的で用意されたものであり、参考(not normative)である。
XPathの基本的な構成ブロックは式である。これは[Unicode]文字(使用されるUnicodeの版は実装定義である。)の列である。この言語には、キーワード、記号、演算数などから構成される様々な種類の式が用意されている。一般的に、式の演算数は別の式である。XPathでは、式は完全に一般的な入れ子であってもよい。
Note:
この仕様書では、[Unicode]文字の文字列の文字符号化方式に関して、何も仮定しないし、何も要求しない。
XMLと同様に、XPathは大文字小文字を区別する言語である。XPathのキーワードは小文字を用い、かつ予約されていない。すなわち、XPath式に出現する名前はXPath言語のキーワードと同じであってもよい。ただしA.3 予約済関数名に挙げられている接頭語なし関数名を除く。
[Definition:
データモデルでは、値は常に列である。] [Definition: 列は0個以上の項目の順序付きコレクションである。] [Definition: 項目は原子値か節点である。] [Definition:
原子値は[XML
Schema]で定義される原子型の値空間に含まれる値である。] [Definition: 節点は[XQuery/XPath Data Model
(XDM)]で定義されている節点の種類のいずれかのインスタンスである。]
各節点は唯一の節点識別性、1つの型付けされた値、そして1つの文字列値を持つ。これに加え、いくつかの節点は名前を持つ。節点の型付けされた値は0個以上の原子値からなる列である。節点の文字列値はxs:string型の値である。節点の名前はxs:QName型の値である。
[Definition: ただ一つの項目しか含まない列を単一値列という。]項目は、その項目を含む単一値列と同一である。列が入れ子になることは決してない。例えば1, (2, 3), () という値を一つの列に結合した結果は (1, 2, 3)になる。[Definition: 0個の項目を含む列を空列という。]
[Definition: XDMインスタンスという用語は値という用語と同義であり、データモデル中の節点や原子値からなる制約なしの列を表す。]
XPathにおける名前はQNameと呼ばれ、[XML
Names]中の文法に従う。[Definition:
字句としては、QNameは、省略可能な名前空間接頭辞1つと局所名1つからなる。名前空間接頭辞があるなら、局所名と名前空間接頭辞はコロンで区切られる。]
字句としてのQNameは、静的既知名前空間[err:XPST0081]を用いて名前空間接頭辞を名前空間URIに解決することにより、展開済QNameに変換することができる。
[Definition:
展開済QNameは、省略可能な名前空間URIと局所名からなる。また展開済QNameは、元の名前空間接頭辞を(もしあるなら)保存し、展開済QNameを文字列に型変換することを可能とする。]名前空間URIの値は、[XML
Schema]中のxs:anyURIのためのルールに従って、空白に関して正規化される。2つの展開済QNameが等しいとは、それらの名前空間URIが等しく、かつそれらの局所名が等しいときである(それらの名前空間接頭辞が等しくなくてもよい)。名前空間URIと局所名はコード位置に基づいて比較され、それ以上の正規化は行われない。
この文書では、以下の名前空間接頭辞を、以下に列挙する名前空間URIを表すものとして用いる。この文書でのこれらの名前空間接頭辞の束縛は参考である。
xs = http://www.w3.org/2001/XMLSchema
fn = http://www.w3.org/2005/xpath-functions
err = http://www.w3.org/2005/xqt-errors (2.3.2 エラーの識別と報告を見よ)
要素節点は有効範囲内名前空間と呼ばれる性質を持つ。[Definition: 要素節点の有効範囲内名前空間性質は、名前空間束縛の集合である。それぞれの名前空間束縛は名前空間接頭辞とURIを関連づけており、したがって有効範囲内名前空間は、その要素の有効範囲内でQNameを解釈するときに用いることのできる名前空間接頭辞の集合を定義する。ある要素が与えられると、名前空間束縛のうち1つは空の接頭辞を持っていてもよい。この名前空間束縛のURIは、その要素の有効範囲におけるデフォルト名前空間である。]
[XPath 1.0]では、要素節点の有効範囲内名前空間は、名前空間軸上に配置される名前空間節点のコレクションとして表される。XPathバージョン2.0では、名前空間軸は推奨されず、ホスト言語によって支援される必要もない。名前空間軸を支援しないホスト言語では、名前空間束縛を節点の形で表現する必要はない。
[Definition: この仕様書では、URIという用語は、[RFC3986]で定義され[RFC3987]で新しい名前IRIとして拡張されたUniversal Resource Identifierを表す。] ただし、IRIよりもURIという用語を好んで残している。"Base URI"のように、すべてのXML関連の仕様書で定義され、また参照されてきた概念に新しい名前を与えることを避けるためである。
[Definition: ある式に対する式文脈は、その式の結果に影響を与えうるすべての情報からなる。] この情報は静的文脈と動的文脈という2種類に分けられる。
[Definition: 式の静的文脈は、その式の評価よりも静的解析において有効である情報である。] この情報は、式が静的エラーを含むかどうか決定するのに用いることができる。もし式の解析が、静的文脈中の値を割り当てられていない構成要素に依存するならば、静的エラーが発生する [err:XPST0001]。
静的文脈の構成要素を以下にまとめる。各構成要素のデフォルト初期値はホスト言語で指定されていてもよい。各構成要素の有効範囲はC.1 静的文脈の構成要素で指定されている。
[Definition: XPath
1.0互換モード。この値がtrueであるのは、XPathバージョン1.0への後方互換性のためのルールが有効である場合である。そうでない場合はfalseになる。]
[Definition:
静的既知名前空間。これは、組(接頭辞,
URI)の集合であり、与えられた式の静的処理の間分かっているすべての名前空間を定義している。] URIの値は[XML
Schema]中のxs:anyURI型のためのルールに従って、空白に関して正規化される。有効範囲内名前空間と静的既知名前空間の違いに注意せよ。前者は要素節点の動的性質であり、後者は式の静的性質である。
[Definition:
デフォルト要素/型名前空間。これは名前空間URIか"none"である。名前空間URIは、もしあれば、接頭辞のないQNameのうち要素や型名が期待される場所に出現するもののために用いられる。]
URIの値は、[XML
Schema]中のxs:anyURI型のためのルールに従って、空白に関して正規化される。
[Definition:
デフォルト関数名前空間。これは名前空間URIか"none"である。名前空間URIは、もしあれば、接頭辞のないQNameのうち関数名が期待される場所に出現するもののために用いられる。]
URIの値は、[XML
Schema]中のxs:anyURI型のためのルールに従って、空白に関して正規化される。
[Definition: 有効範囲内スキーマ定義。これは、式の処理の間有効範囲内にあるすべての要素定義、属性定義、およびスキーマ定義を表す総称的用語である。] 次の3つの部分を含む。
[Definition: 有効範囲内スキーマ型。各スキーマ型定義は、 展開済QName (名前付けされた型に対して) か実装依存の型識別子 (無名型に対して)のいずれかで識別される。有効範囲内スキーマ型は2.5.1 既定義スキーマ型で述べられる既定義スキーマ型を含む。 ]
[Definition: 有効範囲内要素定義。各要素定義は、展開済QName (最上位要素定義に対して)か実装依存の要素識別子 (局所要素定義に対して)のいずれかで識別される。] 要素定義は、その要素の置換グループの加入に関する情報を含む。
[Definition: 置換グループは[XML Schema]第1部, 2.2.2.2節で定義されている。直観的には、与えられた要素(先導要素という)を先頭とする置換グループは、スキーマ妥当性検証の結果に影響を与えることなく先導要素に対して置換することのできる要素集合からなる。]
[Definition: 有効範囲内属性定義 各属性定義は展開済QName (最上位属性定義に対して) か実装依存の属性識別子 (局所属性定義に対して)のいずれかで識別される。]
[Definition: 有効範囲内変数。これは組 (展開済QName, 型) の集合であり、式中で参照可能な変数の集合を定義する。展開済QNameは変数名、型はその変数の静的型である。]
変数を束縛する式 (for式, some式,
every式など)は、その式の部分式の有効範囲内変数を新しく束縛された変数とその型によって拡張する。
[Definition: 文脈項目の静的型。この構成要素は、与えられた式の有効範囲内における、その文脈項目の静的型を定義する。]
[Definition: 関数のシグネチャ。この構成要素は、式中で呼び出し可能な関数の集合を定義する。関数はそれぞれ、その展開済QNameと次数 (引数の数) によって一意に識別される。] 名前と次数に加え、関数のシグネチャはそれぞれ、その関数の引数と結果の静的型を指定する。
関数のシグネチャは、構成子関数のシグネチャを含む。これについては3.10.4 構成子関数で議論する。
[Definition: 静的既知照合順序。これは組 (URI, 照合順序)の実装定義の集合である。式の処理に用いることのできる照合順序の名前を定義する。] [Definition: 照合順序は、文字列とURIを比較し、その延長として、順序づける方法の仕様である。照合順序のより完全な定義については[XQuery 1.0 and XPath 2.0 Functions and Operators]を見よ。]
[Definition:
デフォルト照合順序。これは、明示的に照合順序が指定されていないときに、静的既知照合順序に含まれる照合順序の一つを、xs:string型とxs:anyURI型
(およびこれらから導出される型) の値を比較したり順序付けしたりする関数や演算子で用いられる照合順序として識別する。]
[Definition: 基底URI。 これは絶対URIであり、
(例えばfn:resolve-uri関数によって)相対URIを解決するのに必要なときに用いられる。]
URIの値は[XML
Schema]中のxs:anyURI型のためのルールに従って、空白に関して正規化される。
[Definition: 静的既知文書。
これは文字列から型への写像である。文字列は資源の絶対URIを表しており、fn:doc関数を用いて得られる可能性がある。型は、与えられたURIをリテラル引数とするfn:doc呼び出しの静的型である。]
fn:docの引数が静的既知文書にはない文字列リテラルであるとき、fn:docの静的型はdocument-node()?である。
Note:
静的既知文書の目的は静的型情報を提供することであり、どの文書が利用可能かを決定することではない。URIが静的既知文書中になくても、fn:docを用いてアクセスできる。
[Definition:
静的既知コレクション。これは文字列から型への写像である。文字列は資源の絶対URIであり、fn:collection関数を用いて得られる可能性がある。型は節点列型であり、このURIを引数としてfn:collection関数を呼び出した結果となる。]
fn:collectionの引数が静的既知コレクションにない文字列リテラルであるとき、fn:collectionの静的型はnode()*である。
Note:
静的既知コレクションの目的は静的型情報を提供することで、どのコレクションが利用可能かを決定することではない。URIが静的既知コレクションになくても、fn:collectionを用いてアクセスできる。
[Definition:
静的既知デフォルトコレクション型。これは節点列型であり、fn:collection関数を引数なしで呼び出した結果となる。]
実装によって他の値に初期化されない限り、静的既知デフォルトコレクション型の値はnode()*である。
[Definition: 式の動的文脈は、その式が評価されているときに利用可能な情報として定義される。] 式の評価が動的文脈のうち値が割り当てられていない部分に依存するとき、動的エラーが発生する [err:XPDY0002]。
動的文脈の個々の構成要素を以下にまとめる。これらの構成要素の意味を支配する詳細なルールはC.2 動的文脈の構成要素にある。
動的文脈は静的文脈の部分要素すべて、および以下に列挙する追加構成要素を含む。
[Definition: 動的文脈の最初の3つの構成要素 (文脈項目、文脈位置、文脈サイズ)を、式の焦点という。] 焦点を用いると、処理器はどの項目が式によって処理されているかを追跡することができる。
ある種の言語の構成要素、すなわち経路式 E1/E2と述語
E1[E2]は、部分式の評価の際に新しい焦点を作成する。これらの構成要素では、E1を評価した結果の列中の項目それぞれに対し、E2が1回評価される。
E2が評価されるたびに、異なる焦点で評価が行われる。E2を評価する焦点を内部焦点、E1を評価する焦点を外部焦点という。内部焦点は、E2が評価されている間のみ存在する。この評価が終了するとき、含むほうの式の評価が元の焦点のまま行われる。
[Definition:
文脈項目は現在処理している項目である。項目は原子値か節点である。][Definition:
文脈項目が節点であるとき、文脈節点と呼ぶこともできる。]
文脈項目は1つのドット(.)からなる式によって得られる。式E1/E2またはE1[E2]が評価されるとき、E1を評価して得られる列中の項目それぞれが、E2の評価に対する内部焦点の文脈項目となる。
[Definition:
文脈位置は、現在処理されている項目列中での文脈項目の位置である。]文脈項目が変化するたび、文脈位置も変化する。焦点が定義されているとき、文脈位置の値は0より大きい整数である。式fn:position()によって文脈位置が返される。式E1/E2またはE1[E2]が評価されるとき、E2の評価に対する内部焦点での文脈位置は、E1を評価して得られる列中の文脈項目の位置である。列の最初の項目の位置は常に1である。文脈位置は常に、文脈サイズより小さいか等しい。
[Definition:
文脈サイズは、現在処理されている項目列に含まれる項目数である。]
文脈サイズの値は常に0より大きい整数である。式fn:last()によって文脈サイズが返される。式E1/E2またはE1[E2]が評価されるとき、E2の評価に対する内部焦点の文脈サイズは、E1の評価で得られる列に含まれる項目数である。
[Definition: 変数の値。これは、組 (展開済QName, 値)の集合である。式の静的文脈中の有効範囲内変数と同じ展開済QNameを含む。展開済QNameは変数名であり、値はその変数の動的値である。動的値には、その動的型が含まれる。]
[Definition: 関数の実装。関数のシグネチャに含まれる各関数は、引数型のインスタンスから結果型のインスタンスへ写像する関数を利用可能にする関数の実装を持つ。]
[Definition:
現在のdateTime。この情報は式の処理の間のある実装依存の瞬間を表す情報であり、明示的なタイムゾーンを含む。これはfn:current-dateTime関数によって検索することができる。もし式の実行の最中に複数回呼び出されると、この関数は常に同じ結果を返す。]
[Definition: 暗黙タイムゾーン。これは、タイムゾーンを持たない
data, time,
dateTimeなどの値が比較演算や算術演算の中で用いられるときに用いられるタイムゾーンである。暗黙タイムゾーンはxs:dayTimeDuration型の実装定義の値である。タイムゾーンの正しい値の範囲については[XML
Schema]を見よ。]
[Definition:
利用可能文書。これは、文字列から文書節点への写像である。文字列は資源の絶対URIを表す。文書節点は、データモデルを用いて資源を表現する木における根である。fn:doc関数をURIに適用すると、文書節点が返ってくる。]
利用可能文書の集合は静的既知文書の集合に限定されず、また空集合でもよい。
[Definition:
利用可能コレクション。これは、文字列から節点列への写像である。文字列は資源の絶対URIを表す。節点列は、そのURIを引数として与えたときのfn:collection関数の結果を表す。]
利用可能コレクションの集合は静的既知コレクションの集合に限定されず、また空集合でもよい。
[Definition:
デフォルトコレクション。これは、fn:collection関数を引数なしで呼び出したときに結果として得られる節点列である。]
デフォルトコレクションの値は実装によって初期化されてもよい。
図1: 処理モデルの概要
図1は、この後詳細を述べる処理段階の概要を図で示したものである。このうちいくつかの段階は完全にXPathの範疇外である。図1では、これらの段階は言語の境界を表す実線の外側、外部処理とラベル付けされた領域に描かれている。外部処理域には、問合せが行われるデータを表現するXDMインスタンスの生成(2.2.1 データモデルの生成を見よ)、スキーマの輸入処理(2.2.2 スキーマの輸入処理を見よ)、直列化(2.2.4 直列化を見よ)などが含まれる。言語の境界の内側はXPath処理域と呼ばれ、静的解析段階と動的評価段階(2.2.3 式の処理を見よ)が含まれる。 XPath処理域上の無矛盾性制約は2.2.5 無矛盾性制約で定義される。
式が処理できるようになる前に、式の入力データがXDMインスタンスとして表現されなければならない。この処理はXPathの範囲外で発生し、そのため図1ではこの処理を外部処理域に置いている。以下にXML文書をXDMインスタンスに変換する段階を示す。
文書が、XML情報集合([XML Infoset]を見よ)を生成するXMLパーザによって解析される。解析された文書は1つ以上のスキーマに対して妥当性検証されてもよい。この処理は[XML Schema]に記述されているが、この結果、検証後情報集合(Post-Schema Validation Infoset, PSVI)と呼ばれる抽象情報構造が得られる。もし文書に関連するスキーマがなければ、文書の情報集合が保存される。(図1のDM1を見よ。)
情報集合もしくはPSVIが、[XQuery/XPath Data Model (XDM)]に書かれている処理によってXDMインスタンスに変換される。(図1のDM2を見よ。)
上に述べた段階はXDMインスタンスがどのように構築されるかという一例を提供している。XDMインスタンスは関係データベースから直接合成されるかもしれないし、他の方法(図1のDM3を見よ)で構築されるかもしれない。XPathはデータモデルに基づいて定義されるが、XDMインスタンスがどのように構築されるかについては、制約を何も置かない。
[Definition: XDMインスタンス中の要素節点や属性節点はそれぞれ型注釈([XQuery/XPath
Data Model
(XDM)]ではtype-name性質として参照されている)を持つ。節点の型注釈はスキーマ型であり、節点の文字列値と型付けされた値の関連を記述する。]
XDMインスタンスが3.3 Construction
from a PSVIDMに述べられているように妥当なXML文書から導出されたならば、要素節点や属性節点の型注釈はスキーマ妥当性検証から導出される。
XPathは要素節点や属性節点の型注釈に直接アクセスする方法は用意しない。
属性の値は属性節点によって直接表される。型が不明な属性節点(スキーマのない文書に出現する場合など)には型注釈
xs:untypedAtomicが与えられる。
要素の値はその要素の子たちによって表される。子にはテキスト節点やほかの要素節点が含まれてもよい。要素節点の型注釈は、その子テキスト節点の値がどのように解釈されるかを示す。妥当性検証されていない要素(スキーマのない文書中に出現する場合など)には、xs:untypedというスキーマ型が注釈付けされる。妥当性検証されて部分的に妥当だとされた要素にはxs:anyTypeというスキーマ型が注釈付けされる。もし要素がxs:untypedと注釈付けされているなら、そのすべての子孫要素節点もまたxs:untypedと注釈付けされる。しかし、もし要素がxs:anyTypeと注釈付けされているなら、その子孫要素節点のいくつかには、より詳細な型注釈が付けられるかもしれない。
静的文脈内での有効範囲内スキーマ定義はホスト言語によって用意され(図1の段階SI1を見よ)、2.2.5 無矛盾性制約で定義される無矛盾性制約を満たさなければならない。
XPathは、静的解析相と動的評価相という2つの処理相を定義する(図1を参照)。静的解析相では、静的エラー、動的エラー、または型エラーが発生することがある。動的評価相では、動的エラーと型エラーのみ発生することがある。これらの種類のエラーは2.3.1 エラーの種類で定義される。
それぞれの相について、実装はこの文書の仕様に従う結果を得る戦略やアルゴリズムを自由に使ってよい。
[Definition: 静的解析相は式自身と静的文脈に依存する。静的解析相は入力データ(スキーマを除く)には依存しない。]
静的解析相では、XPath式は構文解析され、演算木と呼ばれる内部表現となる(図1の段階SQ1)。構文解析エラーは静的エラーとして発生する [err:XPST0003]。次に静的文脈が実装によって初期化される(段階SQ2)。静的文脈はスキーマ型名、関数名、名前空間接頭辞、変数名などを解決するのに用いられる(段階SQ4)。もし、演算木中のこれらの種類のいずれかの名前が静的文脈になければ、静的エラー([err:XPST0008]もしくは[err:XPST0017])が発生する(ただし、2.5.4.3 要素テストおよび2.5.4.5 属性テストにあるこのルールの例外を見よ)。
次に、演算木は、原子化、あるいは有効ブール値の展開といった暗黙的演算を明示化することで、正規化される。正規化処理については[XQuery 1.0 and XPath 2.0 Formal Semantics]で記述されている。
次に、各式に静的型が付与される(段階SQ6)。[Definition: 式の静的型は型であり、その式が評価されたときに得られる値は必ず静的型に従う。] もし静的型付け機能が支援されているなら、[XQuery 1.0 and XPath 2.0 Formal Semantics]に書かれているルールに従って、さまざまな式の静的型が推論される。もし静的型付け機能が支援されていないなら、割り当てられる静的型は実装依存である。
静的解析相では、もし静的型付け機能が機能しており、かつ式の演算数が、その演算数に適切でない静的型を持つと分かったならば、型エラーが発生する [err:XPTY0004]。静的型検査でエラーが発生せず静的型Tが式に割り当てられたならば、正当な入力データに対しその式を実行すると、型Tの値が生成されるか動的エラーとなることが保証される。
[Definition: 動的評価相は式の値を計算する相である。] 動的評価相は静的解析相が完了した後に行われる。
動的評価相は、静的解析相でエラーが検出されなかった場合に限り行うことができる。もし静的型付け機能が機能しているなら、静的解析の間にすべての型エラーが検出され、動的評価相の実行を妨げるのに役立つ。
動的評価相は、評価している式の演算木(段階DQ1)、入力データ(段階DQ4)、動的文脈(段階DQ5)に依存し、さらに外部環境(段階DQ3)や静的文脈(段階DQ2)から情報を引き出す。動的評価相は新しいデータモデル値を生成したり(段階DQ4)、値を変数に束縛するなどによりそれを動的文脈に展開してもよい(段階DQ5)。
[Definition:
動的型は、計算されるそれぞれの値に対応づけられる。値の動的型は、その値を計算した式の静的型よりも詳細であってもよい(例えば、式の静的型がxs:integer*、すなわち0以上の整数の列であっても、評価時には、その式の値が動的型xs:integer、すなわちただ1つの整数であってもよい)。]
もし式の演算数が、その演算数に適切でない動的型を持っていると分かったならば、型エラーが発生する [err:XPTY0004]。
式が評価される前に静的型付けで多くの型エラーがとらえられるとしても、静的解析では検出されなかったエラーが評価時に発生することはあり得る。例えば、式に文字列から整数への型変換が含まれているかもしれない。これは静的には正しい。しかし、もし実行時の実際の文字列の値が整数に変換できないならば、動的エラーが発生する。同様に、式中で静的型がxs:untypedAtomicであるような値に算術演算子を適用しているかもしれない。これは静的エラーではない。しかし実行時では、もしその値が数型にうまく変換できなければ、動的エラーが発生する。
静的型付け機能が有効であるとき、式の静的解析において型エラーを発生させることは、たとえある入力に対してその式が正常に実行されるとしても、可能である。例えば、引数として要素を要求する関数が式に含まれており、静的解析相でその関数の引数の静的型が省略可能な要素であると推論されたとする。この場合は、たとえ省略可能な要素が存在するような入力データに対してこの関数呼び出しが正常に行われるとしても、型エラーとして扱われ、評価が妨げられる。
[Definition: 直列化はXDMインスタンスをオクテット列に変換する処理である(図1の段階DM4)。] 直列化の一般的な枠組は[XSLT 2.0 and XQuery 1.0 Serialization]に記述されている。
ホスト言語が直列化のオプションを用意していてもよい。
XPathが明確に定義されるためには、入力となるXDMインスタンス、静的文脈、動的文脈が互いに無矛盾でなければならない。以下に列挙する無矛盾性制約はXPathの実装が正しく動作するための前提条件である。これらの無矛盾性制約をどのように強制させるかはこの仕様書の範囲外である。この仕様書は、これらの制約が1つ以上満たされない条件の下での式の結果を定義しない。
無矛盾性制約のいくつかではデータモデルスキーマという用語を用いる。[Definition: XDMインスタンス中のある節点に対して、データモデルスキーマは、その節点の型注釈が導出されたスキーマとして定義される。] スキーマ妥当性検証以外の処理によって構成された節点に対しては、データモデルスキーマは、単に、その節点の型注釈によって表現されるスキーマ型定義から成る。
型注釈を持つ各節点について、その型注釈が有効範囲内スキーマ定義(ISSD)中にあるなら、ISSD中の定義はデータモデルスキーマ中の定義と等価でなければならない。さらに、データモデルスキーマ中のある型から拡張によって導出されるすべての型は、それと等価な定義がISSD中にもなければならない。
XDMインスタンス中と有効範囲内スキーマ定義(ISSD)中の両方にある要素名ENのそれぞれについて、ENを先頭とする置換グループ中にあると分かっているデータモデルスキーマ中のすべての要素は、またENを先頭とする置換グループ中にあると分かっているISSD中の要素でなければならない。
要素名、属性名、有効範囲内変数や関数のシグネチャから参照されているスキーマ型名は、いずれも有効範囲内スキーマ定義中になければならない。ただし、ElementTestの部分から参照されている要素名、AttributeTestの部分から参照されている属性名は除く。
有効範囲内スキーマ定義中に、大域的要素、属性、型名に対する参照がある場合は、対応する要素、属性、型の定義を有効範囲内スキーマ定義中に持っていなければならない。
文字列から利用可能な文書中の文書節点への写像それぞれについて、もし同じ文字列から静的既知文書中の文書型への写像が存在するなら、2.5.4 SequenceTypeの照合にある照合ルールを用いて、文書節点はその文書型に照合されなければならない。
文字列から利用可能コレクション中の節点列への写像それぞれについて、もし同じ文字列から静的既知コレクション中の型への写像が存在するなら、2.5.4 SequenceTypeの照合にある照合ルールを用いて、節点列はその型に照合されなければならない。
デフォルトコレクション中の節点列は、2.5.4 SequenceTypeの照合にある照合ルールを用いて、静的既知デフォルトコレクションに照合されなければならない。
文脈項目の値は、2.5.4 SequenceTypeの照合にある照合ルールを用いて、文脈項目静的型に照合されなければならない。
有効範囲内変数中の2つ組 (変数, 型)のそれぞれと、変数の値中で対応する2つ組 (変数, 値)のうち変数名が等しいものについて、2.5.4 SequenceTypeの照合にある照合ルールを用いて、値と型が照合されなければならない。
静的既知名前空間の中で、接頭辞xmlはhttp://www.w3.org/XML/1998/namespace以外の名前空間URIに束縛されてはならず、またこの名前空間URIにはxml以外の接頭辞が束縛されてはならない。
2.2.3 式の処理で述べたように、XPathは入力データに依存しない静的解析相と入力データに依存する動的評価相を定義する。エラーはいずれの相でも発生してよい。
[Definition: 静的エラーは静的解析相で検出されなければならないエラーである。構文エラーは静的エラーの例である。]
[Definition: 動的エラーは動的評価相で検出されなければならず、静的解析相で検出されてもよいエラーである。数値あふれは動的エラーの例である。]
[Definition: 型エラーは静的解析相、動的評価相のいずれでも発生してもよい。静的解析相では、式の静的型とその式の出現する文脈から期待される型とが一致しないとき、型エラーが発生する。動的評価相では、値の動的型とその値の出現する文脈から期待される型とが一致しないとき、型エラーが発生する。]
静的解析相の結果は、成功か、1つ以上の型エラー、静的エラー、静的に検出される動的エラーのいずれかである。動的評価相の結果は、結果の値か、1つの型エラーか、1つの動的エラーのいずれかである。
1つ以上のエラーが現れたり、エラー条件がこの仕様で定義される1つ以上のエラーの範囲内に入ったりすると、これらのエラーの空でない集合が報告されてもよい。
静的解析相では、静的型付け機能が機能しており、かつ()もしくはdata(())以外の式に割り当てられる静的型がempty-sequence()であるならば、静的エラーが発生する [err:XPST0005]。これにより、有効範囲内スキーマ定義に存在しない要素や属性を問合せが参照している場合がとらえられる。これは綴りの誤りの可能性があるためである。
静的型付け機能が機能しているかどうかに関わらず、もし静的解析相で、ある式が評価されると型エラーや動的エラーを発生する必要がある、ということを実装が決定できるならば、実装は静的解析相でエラーを通知してもよい(しかし通知することを要求されるわけではない)。しかし、fn:error()関数は静的解析相では評価されてはならない。
[Definition: 静的エラー、動的エラー、型エラーに加えて、XPathの実装は、静的解析相、動的評価相のいずれかで警告を発生してもよい。警告が発生する状況や、警告を処理する方法は実装定義である。]
この仕様書で定義されるエラーに加えて、実装は、この仕様書の範囲外の理由により動的エラーを発生してもよい。例えば、さまざまなオブジェクトの最大数や最大サイズに制限があってもよい。このような制限や、これらを越えることによる結果は実装依存である。
この仕様書で定義されるエラーは、err:XPYYnnnnという形式を持つQNameで識別される。ここで:
errはXPathおよびXQueryのエラーのための名前空間、http://www.w3.org/2005/xqt-errorsを表す。この名前空間接頭辞errの束縛はこの文書内の便宜上用いており、参考である。
XPは、そのエラーがXPathのエラーであることを識別する。
YYはエラーの分類を示し、次のような符号化を用いる:
STは静的エラーを表す。
DYは動的エラーを表す。
TYは型エラーを表す。
nnnnは一意に決まる数字コードである。
Note:
XPathのバージョンが変わっても、XPathとXQueryのエラーのための名前空間URIが変わることは期待されない。しかし、この名前空間の内容は、エラー定義が追加されることによって拡張されてよい。
XPath処理器がエラー情報を外部環境に報告する方法は実装定義である。
エラーは、エラーQNameから導出されるURI参照によって次のように表すことができる。名前空間URINSと局所名LPを持つエラーは、URI参照NS#LPで表すことができる。例えば、QNameがerr:XPST0017であるエラーはhttp://www.w3.org/2005/xqt-errors#XPST0017で表せる。
Note:
エラーを識別するコードとともに、実装は、エラーの場所やエラーが検出された処理相などの付加的な情報を返してもよい。実装が付加的な情報を返すことを選択する場合は、この情報を返すのに用いられる機構は実装定義である。
この文書で示した以外に、もし式の演算数が動的エラーを発生するならば、その式もまた動的エラーを発生する。もし式が正常に値を返すことも動的エラーを発生することもできるのであれば、実装は、値を返すか動的エラーを発生するか選択してよい。例えば、論理式expr1
and
expr2は、いずれかの演算数がfalseを返すならば値falseを返してもよい。またいずれかの演算数が動的エラーを発生すれば動的エラーを発生してもよい。
もし式中の1つ以上の演算数がエラーを発生するならば、実装は、どのエラーがその式によって発生するかを選択してよい。例えば、次の式を考える:
($x div $y) + xs:decimal($z)
部分式($x div
$y)とxs:decimal($z)はともにエラーを発生するかもしれない。実装は式"+"によってどちらのエラーが発生するか選択してよい。いったん1つの演算数がエラーを発生すれば、実装が他の演算数を評価することは要求されないが、評価してもよい。
[Definition: 識別可能なQNameに加え、動的エラーは、説明的な文字列や、エラー値と呼ばれる1つ以上の付加的な値を伴ってもよい。] 実装は、アプリケーションで定義されるエラー処理器がエラー値を処理し診断メッセージを生成する機構を提供してもよい。
動的エラーは組み込み関数や演算子によって発生してもよい。例えばdiv演算子は、その演算数がxs:decimal値でかつ第2演算数が0に等しいならば、例外を発生する。組み込み関数や演算子によって発生するエラーは[XQuery
1.0 and XPath 2.0 Functions and Operators]で定義されている。
動的エラーは明示的にfn:error関数を呼び出すことによっても発生する。この関数はエラーを1つ発生させるだけで、値は返さない。この関数は[XQuery
1.0 and XPath 2.0 Functions and
Operators]で定義されている。例えば、次に示す関数呼び出しは動的エラーを発生する。発生する動的エラーは、エラーを識別するQName、説明的な文字列、診断値からなる(接頭辞appが、アプリケーションで定義されるエラーコードを含む名前空間に束縛されていると仮定している)。
fn:error(xs:QName("app:err057"), "Unexpected value", fn:string($v))
実装が異なると、式を評価したり最適化したりする方法として異なるものを選ぶかもしれないので、この節で述べるように、動的エラーの検出や報告についてのある側面は実装依存である。
実装は常に、演算子の演算数をどのような順序で評価しても自由である。
場合によっては、処理器は、形式的な式の意味によって内含されるすべてのデータにアクセスすることなく、式の結果を決定することができる。例えば、選別式の形式的記述では、$s[1]は列$sのすべての項目を検査し、述語position()=1を満たす項目をすべて選ぶことによって評価されるべきであると推奨している。実際は、多くの実装は、列の最初の項目を取ってきて終了してもこの式を評価することができる、と認識している。もし$sが//book[author
eq
'Berners-Lee']と言った式で定義されるならば、この戦略は大きな文書全体の走査を避け、性能を大幅に改善するかもしれない。しかし、この戦略の結果として、式の評価が早く終了してしまうと、式の意味に厳密に従っていれば検出できたであろう動的エラーや型エラーが全く検出できないかもしれない。この例では、もし1個以上のauthor部分要素を持つbook要素が入力中にあると、このようなエラーが発生するかもしれない。
エラーを検出しないコストに関して、処理器がデータへのアクセスを最適化するかもしれない外延は、次のルールで定義される。
演算数(部分式)にEを持つ式Qを考えよう。一般にはEの値は列である。列の評価の中間段階では、その項目のいくつかは分かっているが、残りは未知である。もし、評価の中間段階で、処理器がQを評価した結果として2つの可能性しかない、すなわち値Vかエラーの可能性しかないと証明できるならば、処理器は、演算数Eの残りの項目を評価することなく結果Vを出してもよい。この目的のために、2つの項目の節点と値がともに同一であるならば、2つの値は同じ結果を表現していると考えられる。ここで、節点が同じ識別子を持っているならば、それらの節点は同一である。また、2つの値が等値でかつ全く同じ型を持っているならば、それらの値は同一である。
このルールには例外がある。もし処理器が演算数 E を (その全体であれ部分的にであれ)
評価するならば、処理器は、Eの演算数の実際の値が濃度に関するどんな制約にも反しないことを証明する必要がある。例えば、式$e
eq
0は、$eの値が2個以上の項目を含んでいれば、型エラーという結果になる。処理器は、$eの値の最初の項目を評価した後、可能な結果は、値trueか、濃度の違反による型エラーだけである、と決定することは許されない。$eの値が1個以下の項目しか含まないことを証明しなければならない。
このルールは、式の演算数として考えられるすべての組み合わせに適用される。したがって、式が2つの演算数E1とE2を持っているならば、上のルールを満たすそれぞれの列のどんな例を用いて評価されてもよい。
このルールは連鎖する。AがBの演算数で、BがCの演算数であるならば、処理器はCの値を決めるために充分な数のBの例だけを評価すればよく、さらにBの例を決めるために充分な数のAの例だけを評価すればよい。
これらのルールの効果として、処理器は、列中のあるところより先の項目が、エラーを発生させるかもしれないということ以外に結果に影響を及ぼさないと証明できれば、直ちにその先の項目の検査を止めても構わない。例えば、処理器は、2つの列から等しい値の2つ組を見つければ、直ちにS1
= S2の結果としてtrueを返してもよい。
これらのルールのもう一つの結果として、列中のどの項目も式の結果に貢献しないとき、処理器はその列のどの部分も評価する義務を負わない。しかし、繰り返すが、処理器は要求される濃度の検査は、せずに済ますことができない。対象とする文脈で空列が許されなければ、処理器は、演算数が空列でないことを保証しなければならない。
例:
下の例において、実装が$expr1によって返される項目のうち少なくとも1つが47という値を持つと知ることができる(例えば索引を用いて)ならば、some式の結果としてtrueを返すことが許される。このとき、$expr1によって返される他の項目に、評価するとエラーを発生させるものがあるか探す必要はない。
some $x in $expr1 satisfies $x = 47
以下の例において、実装が、値が47であるような子節点idを持つproduct要素節点を見つけられれば(例えば索引を用いて)、経路式の結果としてこれらの節点を返すことが許される。このとき、他のproduct節点に、整数を値としないid子節点があるためにエラーを発生させるものがあるか探す必要はない。
//product[id = 47]
最適化など、さまざまな理由により、実装は式を等価な式に書き換えることは自由である。エラーを発生させるか発生させないかという点を除いて、等価な式を評価した結果は、元の式を評価した結果と等しくなければならない。式の書換えを以下の例で説明する。
式//part[color eq
"Red"]を考えよう。実装はこの式を//part[color = "Red"][color eq
"Red"]と書き換えることを選択するかもしれない。この実装では、この式を次のように処理するかもしれない。まず part
に関する索引を color によって引き、color が Red であるような part
すべてを素早く見つけ、"=" 述語を処理する。次にこれらの part それぞれについて
"eq" 述語を処理し、確かに一つの color
しか持っていないか検査する。結果は以下のようになる。
Redという1つの color しか持っていない part が返される。
ある part が Red という color と他の color を共に持っていれば、エラーが発生する。
Red という color を持たず Red でない color を複数持つ part が存在してもエラーは引き起こさない。
以下の例の式は、書かれている順に(すなわち左から右へ)正確に評価されれば、型変換エラーを起こすことはできない。どちらの述語も文脈位置に依存しているので、実装は、(例えば索引を利用することで)よりよい性能を得るために、述語を並び替えることを選択するかもしれない。述語を並べ替えることで、式がエラーを引き起こすかもしれない。
$N[@x castable as xs:date][xs:date(@x) gt xs:date("2000-01-01")]
式の書き換えによって引き起こされる想定外のエラーを避けるために、動的エラーを防ぐために設計されたテストを、条件式を用いて表現するべきである。条件式は、実際に選択された分岐中で発生する動的エラーのみ引き起こす。したがって、前の例とは異なり、以下の例では@xがxs:dateに型変換されなくても動的エラーは起こらない。
$N[if (@x castable as xs:date)
then xs:date(@x) gt xs:date("2000-01-01")
else false()]
この節では、XPath式の処理で重要な概念をいくつか説明する。
文書順と呼ばれる順序は、ある式の処理中にアクセス可能なすべての節点の間で定義され、1つ以上の木(文書もしくはその一部)から構成されていてもよい。文書順は[XQuery/XPath Data Model (XDM)]で定義されているが、便宜上その定義をここでも繰り返す。[Definition: 文書順の逆順であるような節点の順序を逆文書順という。]
文書順は全順序である。ただし、節点間の相対順序は実装依存である。[Definition: 直観的には、文書順は直列化されたXML文書中で節点が出現する順序である。] [Definition: 文書順は安定である。ここで安定とは、ある式の処理中、2節点間の相対順序が変化しない(たとえこの順序が実装依存であっても)ことを意味する。]
木では、文書順は次の制約を満たす。
根節点は最初の節点である。
いずれの節点も、その子および子孫のどれよりも前に出現する。
名前空間節点は、それが関連づけられている要素節点の直後に出現する。名前空間節点の相対順序は安定であるが実装依存である。
属性節点は、それが関連づけられている要素節点の名前空間節点の直後に出現する。属性節点の相対順序は安定であるが実装依存である。
兄弟間の相対順序は、親節点の性質children中で出現する順序である。
子および子孫は、弟よりも先に出現する。
異なる木の節点間の相対順序は安定であるが実装依存であり、次の制約に従う。与えられた木T1中のある節点が、別の木T2中のすべての節点より前に出現するならば、木T1中のすべての節点が木T2のすべての節点より前に出現する。
いくつかのXPath演算子の意味は原子化という処理に依存している。原子化がある値に対して適用されるのは、原子値の列が必要となる文脈でその値が用いられるときである。原子化の結果は、原子値の列か型エラー [err:FOTY0012] のいずれかである。[Definition: 列の原子化は、[XQuery 1.0 and XPath 2.0 Functions and
Operators]で定義されている通り、その列にfn:data関数を実行した結果として定義される。]
便宜上、fn:dataの意味を繰り返す。fn:dataの結果は、入力列中の各項目に以下のルールを適用して生成される原子値の列である。
その項目が原子値であれば、その項目を返す。
その項目が節点であれば、その型付けされた値を返す。(もしその節点が型付けされた値を持たないならば、err:FOTY0012が発生する。)
原子化は以下の式の型を処理するのに用いられる。
算術式
比較式
関数呼び出しと関数からの戻り
型変換式
ある状況の下では(以下に列挙する)、値の有効ブール値を得る必要がある。[Definition:
ある値の有効ブール値は、[XQuery 1.0 and
XPath 2.0 Functions and
Operators]で定義されているように、その値にfn:boolean関数を適用して得られる結果として定義される。]
便宜上、fn:booleanの動的意味を繰り返す。
演算数が空列であれば、fn:booleanはfalseを返す。
演算数が、最初の項目が節点であるような列であれば、fn:booleanはtrueを返す。
演算数がxs:boolean型もしくはxs:booleanから導出される型の単一値列であれば、fn:booleanは演算数の値を変化せずに返す。
演算数がxs:string型、xs:untypedAtomic型、もしくはこれらのいずれかから導出される型の単一値列であれば、fn:booleanは、演算数の値の長さが0の場合はfalseを、そうでない場合はtrueを返す。
演算数が数型、もしくは数型から導出される型の単一値列であれば、fn:booleanは、演算数の値がNaNもしくは数として0に等しい場合はfalseを、そうでない場合はtrueを返す。
これ以外のすべての場合について、fn:booleanは型エラー
[err:FORG0006]を引き起こす。
Note:
fn:booleanの静的意味は7.2.4 The
fn:boolean functionFSで定義されている。
列の有効ブール値は、以下のような式の型の処理で暗黙的に計算される。
論理式(and, or)
fn:not関数
ある形式の述語。例えばa[b]
条件式(if)
限量式(some, every)
XPath 1.0 互換モードにおける、一般比較
Note:
有効ブール値の定義は、例えばcast式のようなxs:boolean型への型変換、あるいは引数としてxs:boolean型を期待する関数に値を渡すときには、使わない。
XPathは、入力データへのアクセスを提供する関数集合を持っている。これらの関数は、式が文書や文書の集まりを参照できる方法を用意しているため、特に重要である。ここでは、入力関数について直観的に記述する。これらは[XQuery 1.0 and XPath 2.0 Functions and Operators]で定義されている。
式が入力データにアクセスするには、入力関数の一つを呼び出すか、外部環境によって初期化される動的文脈の一部、例えば変数や文脈項目を参照するか、いずれかによる。
XPathで支援されている入力関数は以下の通りである:
fn:doc関数はURIを含む文字列を受け取る。そのURIが有効文書中の文書と関連づけられていれば、fn:docはその文書のデータモデル表現を内容とするような文書節点を返す。それ以外の場合、動的エラーを引き起こす(詳細は[XQuery 1.0 and XPath 2.0 Functions and
Operators]を見よ)。
1引数のfn:collection関数は、URIを含む文字列を受け取る。そのURIが有効コレクション中のコレクションと関連づけられていれば、fn:collectionはそのコレクションのデータモデル表現を返す。それ以外の場合、動的エラーを引き起こす(詳細は[XQuery 1.0 and XPath 2.0 Functions and
Operators]を見よ)。コレクションは任意の節点列であってもよい。例えば、式fn:collection("http://example.org")//customerは、URIがhttp://example.orgであるようなコレクション中の節点の子孫であるcustomer要素すべてを指し示す。
引数を持たないfn:collection関数は、デフォルトコレクションを返す。これは実装依存の節点列である。
XPathの型システムは[XML Schema]に基づいており、[XQuery 1.0 and XPath 2.0 Formal Semantics]で形式的に定義されている。
[Definition: 列型(sequence type)はSequenceTypeの構文を用いて表現することのできる型である。列型は、XPath式で型を参照する必要があるときにはいつでも用いられる。列型という用語は、この構文がXPathの値の型を記述するのに用いられる、ということを示唆している。この値は常に列である。]
[Definition: スキーマ型(schema type)は[XML Schema]の機能([XML
Schema]の組み込み型を含む)を用いて定義された(または定義できる)型である。スキーマ型は要素節点や属性節点の型注釈として用いることができる(ただし、xs:NOTATIONやxs:anyAtomicTypeといった実体化不能型は除く。このような型の場合は、その導出型を用いることができる)。スキーマ型は複合型か単純型のいずれかである。単純型はさらにリスト型、共用体型、原子型に分けられる(これらの用語の定義と説明は[XML
Schema]を見よ)。]
原子型は列型とスキーマ型という種類の間の集合積を表現している。原子型、例えばxs:integerやmy:hatsizeは列型でもありスキーマ型でもある。
静的文脈内の有効範囲内スキーマ型は、ホスト言語で定義されている既定義スキーマ型の集合で初期化される。この集合にはhttp://www.w3.org/2001/XMLSchema名前空間内のスキーマ型の一部またはすべてが含まれていてもよい。この文書では、この名前空間を名前空間接頭辞xsで表している。この名前空間のスキーマ型は
[XML Schema] で定義され、[XQuery/XPath Data Model (XDM)]
で定義された方を追加することで拡張されている。この名前空間内のスキーマ型は[XQuery/XPath Data Model
(XDM)]で定義されており、以下にその概略を示す。
[Definition:
xs:untypedは、妥当性検証されていない要素節点、あるいはskipモードで妥当性検証された要素節点の型注釈として用いられる。]
xs:untypedからは既定義スキーマ型は何も導出されない。
[Definition:
xs:untypedAtomicは、より詳細な型が割り当てられていないテキストなど、型付けされていない原子データを示すのに用いられる原子型である。]
skipモードで妥当性検証された属性は、データモデル中ではxs:untypedAtomicという型注釈のついた属性節点として表現される。xs:untypedAtomicからは、既定義スキーマ型は何も導出されない。
[Definition:
xs:dayTimeDurationはxs:durationから制限によって導出される。xs:dayTimeDurationの字句表現は、日、時、分、秒の部分だけを含むように制限されている。]
[Definition:
xs:yearMonthDurationはxs:durationから制限によって導出される。xs:yearMonthDurationの字句表現は、年と月の部分だけを含むように制限されている。]
[Definition:
xs:anyAtomicTypeはすべての原子値を含む(そして原子値以外の値は含まれない)原子型である。この基礎型は、原子型を含むすべての単純型、リスト型、および共用体型が導出されるxs:anySimpleTypeである。xs:integer,
xs:string,
xs:untypedAtomicなど、すべての原始的原子型は基礎型としてxs:anyAtomicTypeを持つ。]
Note:
xs:anyAtomicTypeはXDMインスタンス中の実際の値の型には出現しない。
xs名前空間中のスキーマ型の間の関連を図2に示す。XPathの型階層のより完全な記述は[XQuery 1.0 and XPath 2.0 Functions and
Operators]にある。
図2: XPathで用いられるスキーマ型の階層
すべての節点は型付けされた値と文字列値とを持っている。[Definition:
節点の型付けされた値は原子値の列であり、その節点にfn:data関数を適用することで得ることができる。]
[Definition:
節点の文字列値は文字列であり、その節点にfn:string関数を適用することで得ることができる。]
fn:dataとfn:stringの定義は[FunctionsAndOprators]にある。
実装は、節点の型付けされた値と文字列値をともに格納してもよいし、これらの一方だけを格納して、必要なときにもう一方を導出してもよい。節点の文字列値は、その節点の型付けされた値の正しい字句表現でなければならないが、その節点は元のソース文書から文字列表現を保存している必要はない。例えば、ある節点の型付けされた値がxs:integerの値30であったとすると、その文字列値は
"30" でも "0030" でもよい。
節点の型付けされた値、文字列値、および型注釈は密接に関連している。節点が情報集合またはPSVIからの写像で作られたのであれば、これらの性質の関連は[XQuery/XPath Data Model (XDM)]中のルールによって定義される。
読者の便宜のため、さまざまな種類の節点の型付けされた値と文字列値の関連について以下にまとめ、例を用いて説明する。
テキスト節点と文書節点では、型付けされた値と文字列値は等しく、xs:untypedAtomic型のインスタンスである。文書節点の文字列値は、そのすべての子孫のテキスト節点の文字列値を文書順に連接して得られる。
コメント、名前空間、処理命令節点について、型付けされた値は文字列値に等しい。xs:string型のインスタンスである。
型注釈xs:anySimpleTypeまたはxs:untypedAtomicのついた属性節点の型付けされた値は、文字列値に等しく、xs:untypedAtomic型のインスタンスである。その他の型注釈のついた属性節点の型付けされた値は、対応する型に関して[XML
Schema]第2部で定義される字句から値空間への写像を用いて、文字列値や型注釈から導出される。
例: A1
は文字列値"3.14E-2"と型注釈xs:doubleを持つ属性である。A1の型付けされた値は、字句表現として3.14E-2を持つxs:doubleの値である。
例: A2
は型注釈xs:IDREFSを持つ属性であり、各項目の型が原子データ型xs:IDREFであるようなリストデータ型である。A2の文字列値は"bar
baz
faz"である。A2の型付けされた値は、それぞれxs:IDREF型である3つの原子値("bar",
"baz",
"faz")の列である。節点の型付けされた値は、名前付けされたリスト型のインスタンスとは決して扱われない。そのかわり、節点の型注釈がリスト型(xs:IDREFSなど)であれば、型付けされた値は、それが導出される原子型(xs:IDREFなど)の列として扱われる。
要素節点については、型付けされた値と文字列値の関連はその要素の型注釈に依存する。以下の通り:
型注釈がxs:untyped、xs:anySimpleType、もしくは混在内容を伴う複合型(xs:anyTypeを含む)を表していれば、その節点の型付けされた値は文字列値に等しく、xs:untypedAtomicのインスタンスである。しかし、その節点のnilled性質がtrueであれば、型付けされた値は空列である。
例: E1
は型注釈xs:untypedと文字列値"1999-05-31"を持つ要素節点である。E1の型付けされた値は"1999-05-31"であり、xs:untypedAtomicのインスタンスである。
例:
E2は、型注釈formulaを持つ要素節点である。この型注釈は混在内容を伴う複合型である。E2の内容は文字"H"、subscriptと名付けられ文字列値"2"を持つ子要素、文字"O"からなる。E2の型付けされた値は"H2Oであり、xs:untypedAtomicの印寸タンスである。
型注釈が単純型、もしくは単純内容を伴う複合型を表していれば、その節点の型付けされた値は、スキーマ妥当性検証と同じ方法で、文字列値と型注釈から導出される。しかし、その節点のnilled性質がtrueであれば、型付けされた値は空列になる。
例:
E3は型注釈costを持つ要素節点である。この型はいろいろな属性を持ち、かつxs:decimal型の単純内容を持つ複合型である。E3の文字列値は"74.95"である。E3の型付けされた値は74.95であり、xs:decimalのインスタンスである。
例:
E4は型注釈hatsizelistを持つ要素節点である。この型は原子型hatsizeから導出された単純型であり、hatsizeはさらにxs:integerから導出されている。E4の文字列値は"7
8 9"である。E4の型付けされた値は3つの値(7, 8,
9)からなる列であり、3つの値はいずれもhatsize型である。
例:
E5は、メンバの型がxs:integerとxs:stringの共用体型my:integer-or-stringという型注釈を持つ要素節点である。E5の文字列値は"47"である。E5の型付けされた値は、xs:integerとしての47である。なぜならば、E5の内容を妥当性検証したメンバ型がxs:integerであるからである。一般的に、節点の型注釈が共用体型であるときは、その節点の型付けされた値は、共用体のいずれかのメンバ型のインスタンスである。
Note:
実装が節点の文字列値しか格納しておらず、その節点の型注釈が共用体型であるならば、実装はその節点の型付けされた値を適切なメンバ型のインスタンスとして配布しなければならない。
型注釈が空内容を伴う複合型を表していれば、その節点の型付けされた値は空列であり、文字列値は長さ0の文字列である。
型注釈が要素だけからなる内容を伴う複合型を表していれば、その節点の型付けされた値は未定義である。fn:data関数は、このような節点に対して適用されると型エラー
[err:FOTY0012]を引き起こす。このような節点の文字列値は、すべての子孫テキスト節点の文字列値を文書順に連接した文字列値と等しい。
例:
E6は型注釈がweatherである要素節点である。この型は、内容型がelement-onlyと指定されている複合型である。E6はtemperatureおよびprecipitationと名付けられた2つの子節点を持つ。E6の型付けされた値は未定義であり、fn:data関数をE6に適用するとエラーを引き起こす。
XPath式中の型を参照する必要があるときはいつでも、SequenceTypeの文法が用いられる。
| [50] | SequenceType |
::= | ("empty-sequence" "(" ")") |
| [52] | ItemType |
::= | KindTest | ("item" "("
")") | AtomicType |
| [51] | OccurrenceIndicator |
::= | "?" | "*" | "+" |
| [53] | AtomicType |
::= | QName |
| [54] | KindTest |
::= | DocumentTest |
| [56] | DocumentTest |
::= | "document-node" "(" (ElementTest | SchemaElementTest)?
")" |
| [64] | ElementTest |
::= | "element" "(" (ElementNameOrWildcard (","
TypeName "?"?)?)? ")" |
| [66] | SchemaElementTest |
::= | "schema-element" "(" ElementDeclaration
")" |
| [67] | ElementDeclaration |
::= | ElementName |
| [60] | AttributeTest |
::= | "attribute" "(" (AttribNameOrWildcard (","
TypeName)?)? ")" |
| [62] | SchemaAttributeTest |
::= | "schema-attribute" "(" AttributeDeclaration
")" |
| [63] | AttributeDeclaration |
::= | AttributeName |
| [65] | ElementNameOrWildcard |
::= | ElementName |
"*" |
| [69] | ElementName |
::= | QName |
| [61] | AttribNameOrWildcard |
::= | AttributeName |
"*" |
| [68] | AttributeName |
::= | QName |
| [70] | TypeName |
::= | QName |
| [59] | PITest |
::= | "processing-instruction" "(" (NCName | StringLiteral)? ")" |
| [58] | CommentTest |
::= | "comment" "(" ")" |
| [57] | TextTest |
::= | "text" "(" ")" |
| [55] | AnyKindTest |
::= | "node" "(" ")" |
特別な型empty-sequence()を除き、列型は、列中の各項目の型に制約を加える項目型、および列の項目数に制約を加える濃度からなる。項目型item()は任意の種類の項目を許すが、これを除き、項目型は節点型(element()など)と原子型(xs:integerなど)に分けられる。
要素節点や属性節点を表す項目型は、これらの節点の必要な型注釈を、スキーマ型の形式で指定してもよい。したがって、項目型element(*,
us:address)は、us:addressと名付けられたスキーマ型(あるいはこの型から導出される型)を型注釈とする要素節点を表す。
以下に、XPath式で用いられる列型の例をいくつか示す。
xs:dateは、xs:dateと名付けられた組み込み原子スキーマ型を参照する。
attribute()?は省略可能な属性節点を参照する。
element()は任意の要素節点を参照する。
element(po:shipto,
po:address)は、po:shiptoという名前を持ち、かつpo:address(もしくはpo:addressから導出されるスキーマ型)を型注釈に持つ要素節点を参照する。
element(*,
po:address)は、任意の名前を持ち、かつpo:address(もしくはpo:addressから導出されるスキーマ型)を型注釈に持つ要素節点を参照する。
element(customer)は、customerと名付けられ、かつ任意の型注釈を持つ要素節点を参照する。
schema-element(customer)は、名前がcustomerであり(もしくはcustomerを先頭とする置換グループの中にあり)、かつ型注釈が、有効範囲内要素定義中のcustomer要素のために定義されたスキーマ型に照合するような要素節点を参照する。
node()*は、任意の種類の節点0個以上からなる列を参照する。
item()+は、1個以上の節点もしくは原子値からなる列を参照する。
[Definition: 式の評価の間、既知の動的型が期待される列型に「照合」されるか決定する必要があることがある。この処理をSequenceTypeの照合という。]
例えば、式instance ofは、与えられた値の動的型が与えられた列型に照合されればtrueを返し、照合されなければfalseを返す。
列型中に出現するQNameは、静的既知名前空間と(もし適用可能であれば)デフォルト要素/型名前空間を用いて名前空間URIに展開される接頭辞を持つ。接頭辞のない属性
QName はどの名前空間にも属さない。QName の等価性は eq 演算子によって定義される。
SequenceTypeの照合のためのルールは、値の動的型を、期待される列型と比較する。これらのルールは[XQuery 1.0 and XPath 2.0 Formal Semantics]で定義される、値と期待される型との照合を行う形式的ルールの部分集合である。なぜなら、Formal Semanticsは、SequenceTypeの文法を用いて表現できない型に対して値を照合することができなければならないからである。
SequenceTypeの照合のためのルールのいくつかでは、与えられたスキーマ型が期待されるスキーマ型と同じかまたは導出されるかを決定する必要がある。与えられたスキーマ型は"既知"(有効範囲内スキーマ定義で定義されている)か、または"未定義"(有効範囲内スキーマ定義で定義されていない)のいずれかであってもよい。未定義スキーマ型は、例えば、ソース文書が静的文脈に輸入されていないスキーマを用いて妥当性検証されている場合などに現れるかもしれない。この場合、実装は、未定義のスキーマ型が期待されるスキーマ型から導出されるか決定する実装依存の機構を用意することが許される(しかし用意しておく必要はない)。 例えば、実装は型階層に関する情報を含むデータ辞書を管理していてもよい。
[Definition: 動的型が期待される型から導出されるような値を用いることを部分型置換という。]
部分型置換は、値の実際の型は変更しない。例えば、xs:integerの値をxs:decimalの値が期待される場所で用いても、その値の型はxs:integerのまま保たれる。
SequenceTypeの照合の定義は、derives-from(AT,
ET)という名前の擬似関数に頼っている。この関数は、実際の単純スキーマ型もしくは複合スキーマ型ATと、期待される単純スキーマ型もしくは複合スキーマ型ETをとり、ブール値を返すか、型エラー [err:XPTY0004]を発生する。
擬似関数derives-fromは以下で定義され、また[XQuery 1.0 and XPath 2.0 Formal
Semantics]で形式的に定義されている。
ETが既知の型で、以下の3つの条件のいずれかが真であるとき、derives-from(AT,
ET)はtrueを返す。
ATが有効範囲内スキーマ定義中にあるスキーマ型で、ETと同じか、ETから制限もしくは拡張によって導出される。
ATが有効範囲内スキーマ定義には含まれないスキーマ型で、実装依存の機構によりATがETから制限により導出されると決定できる。
derives-from(IT,
ET)とderives-from(AT,
IT)が真であるようなスキーマ型ITが存在する。
ETが既知の型で、以下の条件のうち1番目と3番目、もしくは2番目と3番目が真であるとき、derives-from(AT,
ET)はfalseを返す。
ATが有効範囲内スキーマ定義中にあるスキーマ型で、ETと等しくなく、ETから制限または拡張によって導出されない。
ATが有効範囲内スキーマ定義にないスキーマ型で、実装依存の機構によりATが制限によってETから導出されない。
derives-from(IT,
ET)とderives-from(AT,
IT)がともに真であるようなスキーマ型ITが存在しない。
以下のとき、derives-from(AT,
ET)は型エラー [err:XPTY0004]を発生する。
ETが未定義の型である。もしくは
ATが未定義の型で、実装は、ATが制限によってETから導出されるか決定できない。
SequenceTypeの照合のためのルールを以下に述べ、例を示す(例は説明が目的であり、可能な場合をすべて網羅しているわけではない)。
列型
empty-sequence()は、空列である値と照合される。
OccurrenceIndicatorのないItemTypeがただ1つの項目を含む任意の値と照合されるのは、そのItemTypeがその項目と照合されるときである(2.5.4.2 ItemTypeと項目の照合を見よ)。
OccurrenceIndicatorのあるItemTypeが値と照合されるのは、その値の項目の数がOccurrenceIndicatorと照合され、ItemTypeがその値の各項目と照合されるときである。
OccurrenceIndicatorは列中の項目数を以下のように指定する。
?は0個もしくは1個の項目と照合される
*は0個以上の項目と照合される
+は1個以上の項目と照合される
これらのルールの結果として、OccurrenceIndicatorが*もしくは?であるような任意の列型は、空列である値と照合される。
QNameのみからなるItemTypeはAtomicTypeと解釈される。AtomicType
AtomicTypeが実際の型がATである原子値と照合されるのは、derives-from(AT,
AtomicType)がtrueの場合である。もしAtomicTypeとして用いられているQNameが有効範囲内スキーマ定義中の原子型として定義されていないならば、静的エラーが発生する [err:XPST0051]。
例: AtomicType
xs:decimalは値12.34
(実数リテラル)と照合される。もしshoesizeがxs:decimalから制限によって導出される原子型であれば、xs:decimalはまた、型がshoesizeであるような値とも照合される。
Note:
xs:IDREFSのように原子型でない型の名前は、この文脈では認められないが、しばしば、xs:IDREF+のように出現標識を伴った原子型によって置き換えることができる。
item()は任意の単一項目と照合される。
例:
item()は、原子値1や要素<a/>と照合される。
node()は任意の節点と照合される。
text()は任意のテキスト節点と照合される。
processing-instruction()は任意の処理命令節点と照合される。
processing-instruction(N)は、処理命令節点のうち名前(XMLでは処理命令の"PITarget"という)がNに等しいものに照合される。ここでNはNCNameである。
例:
processing-instruction(xml-stylesheet)は、処理命令のうちPITargetがxml-stylesheetであるものに照合される。
XPath1.0との後方互換性のため、処理命令のPITargetは文字列リテラルとしても表されてもよい。例えばこの例の通り:
processing-instruction("xml-stylesheet")
comment()は任意のコメント節点に照合される。
document-node()は任意の文書節点に照合される。
document-node(E)は、文書節点のうちただ1つの要素節点を含むものに照合される。1つ以上のコメント節点や処理命令節点が含まれていてもよい。ここでEは、その要素節点に照合されるElementTestまたはSchemaElementTestである(2.5.4.3
要素テストおよび2.5.4.4
スキーマ要素テストを見よ)。
例:
document-node(element(book))は、文書節点のうち、ElementTest
element(book)によって照合されるようなただ1つの文書節点を含むものに照合される。
ElementTest、SchemaElementTest、AttributeTest、またはSchemaAttributeTestであるようなItemTypeは、以下の節で述べる要素節点または属性節点に照合される。
ElementTestは、要素節点をその名前や型注釈と照合するのに用いられる。ElementTestは以下の形式のどれをとってもよい。これらの形式では、ElementNameは有効範囲内要素定義中にある必要はないが、TypeNameは有効範囲内スキーマ型中になければならない。なお、置換グループは、ElementTestの意味には影響を及ぼさない。
element()とelement(*)は任意の単一要素節点に照合され、その名前や型注釈とは関係しない。
element(ElementName)は、要素節点のうち名前がElementNameであるようなものに照合され、その型注釈やnilled性質とは関係しない。
例:
element(person)は、要素節点のうち名前がpersonのものと照合される。
element(ElementName, TypeName)は、要素節点のうち名前がElementNameのものに照合される。ただし照合されるのはderives-from(AT,
TypeName
)がtrueであり、その節点のnilled性質がfalseであるときである。ここでATはその要素節点の型注釈である。
例: element(person,
surgeon)は、nilledでない要素節点のうち名前がpersonであり、型注釈がsurgeonである
(もしくはsurgeonから導出される)ものに照合される。
element(ElementName, TypeName?)は、要素節点のうち名前がElementNameのものに照合される。ただし照合されるのはderives-from(AT,
TypeName)がtrueであるときである。ここでATはその要素節点の型注釈である。その節点のnilled性質はtrueでもfalseでもよい。
例: element(person,
surgeon?)は、nilledもしくはnilledでない要素節点のうち、名前がpersonであり、型注釈がsurgeonである
(もしくはsurgeonから導出される)ものに照合される。
element(*, TypeName)は、名前に関係なく要素節点に照合される。ただし照合されるのはderives-from(AT,
TypeName
)がtrueであり、その節点のnilled性質がfalseであるときである。ここでATはその要素節点の型注釈である。
例: element(*,
surgeon)は、nilledでない要素節点のうち、型注釈がsurgeonである
(もしくはsurgeonから導出される)ものに照合され、その名前とは関係しない。
element(*, TypeName
?)は、名前に関係なく要素節点に照合される。ただし照合されるのはderives-from(AT,
TypeName
)がtrueであるときである。ここでATはその要素節点の型注釈である。その節点のnilled性質はtrueでもfalseでもよい。
例: element(*,
surgeon?)は、nilledであるかnilledでない要素節点のうち、型注釈がsurgeonである
(もしくはsurgeonから導出される)ものに照合され、その名前とは関係しない。
SchemaElementTestは、要素節点のうち、有効範囲内要素定義中にある対応する要素定義に対して照合される。これは次のような形式をとる。
schema-element(ElementName)
もしSchemaElementTest中で指定されているElementNameが有効範囲内要素定義にないならば、静的エラーが発生する [err:XPST0008]。
SchemaElementTestは、以下の3つの条件がすべて満たされるとき、候補要素節点に照合される。
候補節点の名前が、指定されたElementNameに照合されるか、ElementNameと名付けられた要素を先頭とする置換グループ中の要素名に照合される。
derives-from(AT,
ET)がtrueである。ここでATはその候補節点の型注釈、ETは有効範囲内要素定義中で要素ElementNameのために定義されたスキーマ型である。
有効範囲内要素定義中のElementNameのための要素定義がnillableでないならば、その候補節点のnilled性質はfalseである。
例: SchemaElementTest
schema-element(customer)は候補要素節点に照合される。ただし照合されるのはcustomerが有効範囲内要素定義中の最上位要素定義であり、候補節点の名前がcustomerであるかcustomerを先頭とする置換グループ中にあり、候補節点の型注釈がcustomer要素のために定義されたスキーマ型と同じか導出されており、候補節点がnilledであるかcustomerがnillableと定義されているときである。
AttributeTestは、属性節点をその名前や型注釈と照合するのに用いられる。AttributeTestは以下の形式のどれをとってもよい。これらの形式で、AttributeNameは有効範囲内属性定義中にある必要はないが、TypeNameは有効範囲内スキーマ型中にはなければならない。
attribute()とattribute(*)は任意の単一属性節点に照合され、その名前や型注釈とは関係しない。
attribute(AttributeName)は、属性節点のうち名前がAttributeNameのものに照合され、その型注釈とは関係しない。
例:
attribute(price)は、名前がpriceである任意の属性節点に照合される。
attribute(AttributeName, TypeName)は、属性節点のうち名前がAttributeNameであり、derives-from(AT,
TypeName
)がtrueであるようなものに照合される。ここでATはその属性節点の型注釈である。
例: attribute(price,
currency)は、属性節点のうち名前がpriceで型注釈がcurrencyである
(もしくはcurrencyから導出される)ものに照合される。
attribute(*, TypeName)は、名前に関係なく属性節点のうちderives-from(AT,
TypeName)がtrueであるようなものに照合される。ここでATはその属性節点の型注釈である。
例: attribute(*,
currency)は、属性節点のうち型注釈がcurrencyである
(もしくはcurrencyから導出される)ものに照合され、その名前とは関係しない。
SchemaAttributeTestは、属性節点のうち、有効範囲内属性定義中の対応する属性定義に対する属性節点に照合される。これは次のような形式をとる。
schema-attribute(AttributeName)
もしSchemaAttributeTest中で指定されるAttributeNameが有効範囲内属性定義になければ、静的エラーが発生する [err:XPST0008]。
SchemaAttributeTestは、以下の条件が2つとも満たされるとき、候補属性に照合される。
候補節点の名前が指定されたAttributeNameに照合される。
derives-from(AT,
ET)がtrueである。ここでATは候補節点の型注釈、ETは有効範囲内属性定義中の属性AttributeNameに対して定義されるスキーマ型である。
例: SchemaAttributeTest
schema-attribute(color)は候補属性節点に照合される。ただし照合されるのはcolorが有効範囲内属性定義中の最上位属性定義であり、候補節点の名前がcolorであり、候補節点の型注釈がcolor属性に対して定義されたスキーマ型と等しいか、それから導出されるときである。
| [77] | Comment |
::= | "(:" (CommentContents | Comment)* ":)" |
| [82] | CommentContents |
::= | (Char+ - (Char* ('(:' |
':)') Char*)) |
コメントは式のための参考的注釈を提供するのに用いてもよい。コメントは字句的な構成要素だけであり式の処理には影響を与えない。
コメントは文字列であり、記号(:と:)によって区切られる。コメントは入れ子になってもよい。
コメントは無視できる空白記号が許されるところにはどこで用いてもよい(A.2.4.1 デフォルト空白処理を見よ)。
以下がコメントの例である。
(: Houston, we have a problem :)
この章では、基本的な式の種類について一つ一つ議論する。それぞれの式の種類はPathExprのような名前を持つ。この名前は、式を定義する文法生成規則の左辺に導入される。XPathは構成可能な言語なので、それぞれの種類の式は、演算子がより高い優先度を持つような別の式を用いて定義される。このようにして、演算子の優先度は、文法中で明示的に表される。
この文書中で式が議論される順番は、演算子の優先度の順番を反映していない。一般に、この文書では、最も単純な種類の式を最初に導入し、続いて、より複雑な式を導入する。完全な文法については、付録を見よ [A XPathの文法]。
XPathの文法の最高位にあるシンボルはXPathである。
| [1] | XPath |
::= | Expr |
| [2] | Expr |
::= | ExprSingle (","
ExprSingle)* |
| [3] | ExprSingle |
::= | ForExpr |
最も優先度の低いXPath演算子はコンマ演算子である。これは、2つの演算数をつないで1つの列を作るのに用いられる。文法に示す通り、一般の式(Expr)は複数のExprSingle演算数から構成することができる。このとき演算数はコンマで区切られる。名前ExprSingleは最上位のコンマ演算子を含まない式を表す。(その名前に反して、ExprSingleは1つ以上の項目を含む列を評価してもよい。)
シンボルExprSingleは、文法中で式の最上位にコンマを含むことが許されないようなあちこちの場所で使われている。例えば、関数呼び出しの各引数はExprSingleでなければならない。なぜなら、関数呼び出しの引数を区切るのにコンマが使われているからである。
コンマの次に低い優先度を持つ式はForExpr, QuantifiedExpr, IfExpr, そしてOrExprである。これらの式は各々、この文書の別の節で述べる。
[Definition: 基本式(primary expression)はXPath言語の基本原式である。これにはリテラル、変数参照、文脈項目式、関数呼び出しなどが含まれる。また、任意の式を括弧でくくって基本式を作ってもよい。これは演算子の優先度を制御するのに有用な場合もある。]
| [41] | PrimaryExpr |
::= | Literal | VarRef | ParenthesizedExpr | ContextItemExpr | FunctionCall |
[Definition: リテラルは原子値の直接的構文表現である。] XPathは2種類のリテラルを支援する。数リテラルと文字列リテラルである。
| [42] | Literal |
::= | NumericLiteral |
StringLiteral |
| [43] | NumericLiteral |
::= | IntegerLiteral |
DecimalLiteral | DoubleLiteral |
| [71] | IntegerLiteral |
::= | Digits |
| [72] | DecimalLiteral |
::= | ("." Digits) | (Digits "." [0-9]*) |
| [73] | DoubleLiteral |
::= | (("." Digits) | (Digits ("." [0-9]*)?)) [eE] [+-]? Digits |
| [74] | StringLiteral |
::= | ('"' (EscapeQuot |
[^"])* '"') | ("'" (EscapeApos
| [^'])* "'") |
| [75] | EscapeQuot |
::= | '""' |
| [76] | EscapeApos |
::= | "''" |
| [81] | Digits |
::= | [0-9]+ |
数リテラルの値のうち"."と文字e,
Eを含まないものはxs:integer型の原子値である。数リテラルの値のうち、"."を含むが文字eもEも含まないものはxs:decimal型の原子値である。数リテラルの値のうち、文字eかEを含むものはxs:double型の原子値である。これらの数リテラルの値は、17.1.1
Casting from xs:string and xs:untypedAtomicFOで指定されているように、xs:untypedAtomicから数型へ型変換するためのルールにしたがって、適切な型へ変換することにより決定される。
文字列リテラルの値は、
xs:stringを型とし、区切りの一重引用符または二重引用符の間の文字によって表される文字列を値とするような原子値である。リテラルが一重引用符で区切られているとき、リテラル中で隣り合った2つの一重引用符は1つの一重引用符と解釈される。同様に、リテラルが二重引用符で区切られているとき、リテラル中で隣り合った2つの二重引用符は1つの二重引用符と解釈される。
リテラル式の例をいくつか示す。
"12.5"は、文字 '1', '2', '.', '5'からなる文字列を表す。
12はxs:integerの値12を表す。
12.5はxs:decimalの値12.5を表す。
125E2は、xs:doubleの値12500を表す。
"He said, ""I don't like it."""は2つの二重引用符と1つの
一重引用符を含む文字列を表す。
Note:
XMLの属性の中など、一重引用符が特別な意味を持つ文脈にXPath式が埋め込まれるときは、さらにエスケープ処理が必要になるかもしれない。
xs:booleanの値trueとfalseは、それぞれ組み込み関数
fn:true()とfn:false()の呼び出しによって表現することができる。
その他の原子型の値は、与えられた型に対する構成子関数を呼び出すことにより構成することができる。XML Schemaの組み込み型に対する構成子関数は[XQuery 1.0 and XPath 2.0 Functions and Operators]で定義されている。一般的に、ある型の構成子関数の名前は、その型の名前(名前空間を含む)と等しい。例えば:
xs:integer("12")は整数値12を返す。
xs:date("2001-08-25")は、型がxs:dateで、値が2001年8月25日という日付を表す項目を返す。
xs:dayTimeDuration("PT5H")は、型がxs:dayTimeDurationで、値が5時間という時間を表す項目を返す。
また構成子関数は、以下の例のように、リテラル表現を持たない特別な値を生成することもできる。
xs:float("NaN")は、"数でない"(Not a
Number)という特別な浮動小数点数の値を返す。
xs:double("INF")は"正の無限大"という特別な二倍長浮動小数点数の値を返す。
また、cast式を用いてさまざまな型の値を構成することもできる。例えば以下の通り。
9 cast as
hatsizeは、型がhatsizeである原子値9を返す。
| [44] | VarRef |
::= | "$" VarName |
| [45] | VarName |
::= | QName |
[Definition: 変数参照は$記号にQNameを続けたものである。] 2つの変数参照が同値であるとは、それらの局所名が等しく、かつそれらの名前空間接頭辞が静的既知名前空間中の同じ名前空間URIに束縛されていることである。接頭辞のない変数参照はどの名前空間にも属さない。
変数参照はそれぞれ有効範囲内変数内の名前に照合されなければならない。有効範囲内変数には以下の出所からの変数が含まれる。
変数束縛はそれぞれ静的有効範囲を持つ。有効範囲は、変数への参照が正しく出現できる場所を定義する。有効範囲の中にない変数を参照すると、静的エラー [err:XPST0008] である。ある式に対して、変数が静的文脈内で束縛されれば、その変数は式全体に対する有効範囲に含まれる。
変数参照が有効範囲内の2つ以上の変数束縛に照合されたときは、その参照は、より内側の束縛、すなわち有効範囲がより小さいほうの束縛を参照すると解釈される。評価時には、変数参照の値は、対応する変数が束縛されている式の値である。変数束縛の有効範囲は、変数を束縛することのできる式それぞれについて個別に定義される。
| [46] | ParenthesizedExpr |
::= | "(" Expr? ")" |
括弧は、複数の演算子を含む式の評価順序をある順に強制するのに用いてもよい。例えば、式(2 + 4) *
5を評価すると30になる。なぜなら括弧式(2 +
4)が最初に評価され、その結果に5が掛けられるからである。括弧をつけなければ、式2 + 4 *
5を評価すると22になる。なぜなら乗算演算子は加算演算子より優先度が高いからである。
空の括弧は、3.3.1 列の構成にある通り、空列を表すのに用いられる。
| [47] | ContextItemExpr |
::= | "." |
文脈項目式を評価すると文脈項目が得られる。これは節点(式fn:doc("bib.xml")/books/book[fn:count(./author)>1]中のように)か、原子値(式(1
to 100)[. mod 5 eq 0]中のように)のいずれかである。
文脈項目が未定義であれば、文脈項目式は動的エラーを引き起こす[err:XPDY0002]。
[Definition: XPathで支援されている組み込み関数は[XQuery 1.0 and XPath 2.0 Functions and Operators]で定義されている。] その他の関数が静的文脈で用意されていてもよい。XPathそれ自体では関数を定義する方法は用意されていないが、ホスト言語でそのような仕組みが用意されていてもよい。
| [48] | FunctionCall |
::= | QName "(" (ExprSingle ("," ExprSingle)*)? ")" |
関数呼び出しは、QNameの後ろに0個以上の式の括弧付きリストが続くような構成をしている。この括弧付きリストを引数という。関数呼び出しのQNameが名前空間接頭辞を持っていなければ、デフォルト関数名前空間に属するとみなす。
関数呼び出しの展開済QNameや引数の数が静的文脈中の関数シグネチャの名前や次数に照合されなければ、静的エラーが発生する[err:XPST0017]。
関数呼び出しは次のように評価される。
引数の式が評価され、引数値を生成する。引数の評価順序は実装依存であり、ある引数を評価することなく関数の本体が評価できるならば、関数はその引数を評価する必要はない。
以下に挙げる関数変換ルールを適用して、引数値がそれぞれ変換される。
変換された引数値を用いて関数が評価される。結果は、関数の定義済返り型のインスタンスか、動的エラーである。関数の結果の動的型は定義済返り型から導出される型であってもよい。関数によって引き起こされるエラーは[XQuery 1.0 and XPath 2.0 Functions and Operators]に定義されている。
関数変換ルールは、引数値を、引数として期待される型に変換するのに用いられる。すなわち、関数の引数の定義済型に変換するのに用いられる。期待される型は列型として表現される。与えられた値に対して、関数変換ルールは以下のように適用される。
XPath
1.0互換モードがtrueであり、かつ引数が期待される型でないならば、以下のような変換が順に引数値Vに適用される。
期待される型が単一項目もしくは省略可能な単一項目 (例: xs:string,
xs:string?, xs:untypedAtomic,
xs:untypedAtomic?, node(),
node()?, item(),
item()?)を要求するならば、値VはV[1]に置き換えられる。
期待される型がxs:stringまたはxs:string?であるならば、値Vはfn:string(V)に置き換えられる。
期待される型がxs:doubleまたはxs:double?であるならば、値Vはfn:number(V)に置き換えられる。
期待される型が原子型の列 (出現標識*, +,
?を伴っていてもよい)であるならば、以下の変換が適用される。
上記の変換を行った後、結果の値が、SequenceTypeの照合のためのルールに従って期待される型に照合されないときは、型エラーが発生する[err:XPTY0004]。 SequenceTypeの照合のためのルールは、導出された型の値を基礎型の値として置換することを許していることに注意せよ。
関数呼び出しの引数はコンマで区切られているので、最上位のコンマ演算子を含む引数式は、括弧で囲まなければならない。以下は、関数呼び出しの例とその説明である。
my:three-argument-function(1, 2,
3)は3つの引数を持つ関数呼び出しである。
my:two-argument-function((1, 2),
3)は2つの引数を持つ関数呼び出しであり、1つ目の引数は2つの値の列である。
my:two-argument-function(1,
())は2つの引数を持つ関数呼び出しであり、2つ目の引数は空列である。
my:one-argument-function((1, 2,
3))は1つの引数を持つ関数呼び出しであり、その引数は3つの値の列である。
my:one-argument-function((
))は1つの引数を持つ関数呼び出しであり、その引数は空列である。
my:zero-argument-function( )は引数のない関数呼び出しである。
| [25] | PathExpr |
::= | ("/" RelativePathExpr?) |
| [26] | RelativePathExpr |
::= | StepExpr (("/" | "//")
StepExpr)* |
[Definition:
経路式は、木の節点の位置を指し示すのに用いることができる。経路式は1つ以上の ステップの並びからなり、各ステップは "/" または
"//", で区切られている。また、経路式は "/" または
"//"で始まる場合もある。]先頭の "/" または
"//"
は、以下に述べるように、経路式の先頭に暗黙的に追加される1つ以上の初期ステップの省略形である。
単一のステップからなる経路式は3.2.1 ステップに述べるように評価される。
経路式の先頭にある "/" は初期ステップfn:root(self::node())
treat as document-node()/の省略形である (ただし、もし "/"
が経路式全体であるならば、末尾の "/"
は展開から省かれる)。この初期ステップの効果は、その経路が文脈節点を含む木の根節点から始まる、ということである。文脈項目が節点でない場合は、型エラーが発生する [err:XPTY0020]。評価時に、文脈節点より上にある根節点が文書節点でなければ、動的エラーが発生する [err:XPDY0050]。
経路式の先頭にある "//" は初期ステップfn:root(self::node())
treat as document-node()/descendant-or-self::node()/の省略形である
(ただし、"//" それ自身は正しい経路式ではない [err:XPST0003])。これらの初期ステップの効果は、文脈節点の存在する木の根を含み、この根の子孫にすべての節点があるような初期節点列を確立するということである。この節点列は、経路式中の次のステップの入力として用いられる。文脈項目が節点でなければ、型エラーが発生する [err:XPTY0020]。評価時に、文脈節点より上にある根節点が文書節点でなければ、動的エラーが発生する [err:XPDY0050]。
Note:
節点の子孫には属性節点や名前空間節点は含まれない。
経路式中の先頭ではない場所に出現する "//" は3.2.4
省略構文に述べるように展開され、 "/"
で区切られるステップの列になる。次に、このステップ列が左から右へ評価される。それぞれの演算
E1/E2は次のように評価される:
式E1が評価され、結果が(空かもしれない)節点列でなければ、型エラーが発生する [err:XPTY0019]。
次に、E1の評価の結果得られる節点それぞれが、2.1.2
動的文脈にあるように、さらにE2の評価のための内部焦点を提供する。
E2の評価すべてから得られた列が以下のように結合される:
E2の評価それぞれが(空かもしれない)節点列を返すなら、これらの列が結合され、節点の識別性に基づき、重複する節点が除去される。結果の節点列は文書順で返される。
E2の評価それぞれが(空かもしれない)原子値列を返すなら、これらの列が順に連接され、返される。
複数のE2の評価の結果、節点と原子値が少なくとも1つずつ返ってきたならば、型エラーが発生する [err:XPTY0018]。
Note:
経路の各ステップが次のステップのための文脈節点を用意するため、その結果、経路の最後のステップしか、原子値列を返すことは許されない。
経路式の例として、child::div1/child::paraは、文脈節点の子要素div1の子要素paraを選択する。言い換えれば、文脈節点の孫要素paraのうちdiv1を親として持つものが選択される。
Note:
文字 "/"
は、完全な経路式としても、"/*"
のようなさらに長い経路式の先頭としても用いることができる。また、"*"
は、乗算演算子であるとともに経路式のワイルドカードでもある。このことにより、"/" が
"*" の左側に出現するとき、構文解析が難しくなる。これは、leading-lone-slash
制約を用いることにより、解決できる。例えば、"/*" と "/ *"
はワイルドカードを含む正しい経路式であるが、"/*5" と "/ * 5"
は構文エラーを引き起こす。/" を演算子の左側で用いる時は、"(/) * 5"
のように、括弧をつけなければならない。同様に、"4 + / * 5"
は構文エラーを引き起こすが、"4 + (/) * 5" は正しい式である。式 "4 +
/" もまた正しい。なぜなら/が演算子の左側に出現していないからである。
| [27] | StepExpr |
::= | FilterExpr | AxisStep |
| [28] | AxisStep |
::= | (ReverseStep |
ForwardStep) PredicateList |
| [29] | ForwardStep |
::= | (ForwardAxis
NodeTest) | AbbrevForwardStep |
| [32] | ReverseStep |
::= | (ReverseAxis
NodeTest) | AbbrevReverseStep |
| [39] | PredicateList |
::= | Predicate* |
[Definition: ステップは経路式の一部であり、項目の列を生成し、その列を0個以上の述語により選別する。ステップの値は、述語を左から右に適用し、これらを満たす項目からなる。ステップは軸ステップまたは選別式のいずれかである。] 選別式の説明は3.3.2 選別式にある。
[Definition: 軸ステップは、指定された軸を通して文脈節点から到達可能な節点の列を返す。このステップは2つの部分からなる。軸はステップでの "移動方向" を定義し、節点テストは節点の種類、名前、型注釈により節点を選択する。] 文脈項目が節点であれば、軸ステップは0個以上の節点からなる列を返す。それ以外の場合は、型エラーが発生する [err:XPTY0020]。得られる節点列は文書順で返される。 軸ステップは前向きステップかまたは逆向きステップのいずれかであり、0個以上の述語がそれに続く。
ステップの省略構文では、軸は省略可能であり、また3.2.4 省略構文にあるように、その他の短縮記法も利用できる。
軸ステップの非省略構文は軸名と節点テストからなり、これらは2つのコロンで区切られる。ステップの結果は、指定された軸を通して文脈節点から到達可能な節点のうち、節点テストで指定される節点の種類、名前、型注釈を持つものからなる。例えば、ステップchild::paraは、文脈節点の子要素paraを選択する。ここでchildが軸の名前であり、paraがこの軸上で選択される要素節点の名前である。利用できる軸の説明は3.2.1.1
軸にある。利用できる節点テストの説明は3.2.1.2
節点テストにある。ステップの例は3.2.3
非省略構文や3.2.4 省略構文で示されている。
XPathは文書を行ったり来たりするための軸の完全な集合を定義しているが、ホスト言語がこれらの軸の部分集合を定義してもよい。以下の軸が定義されている。
child軸は文脈節点の子を含む。これらの節点は[XQuery/XPath Data Model
(XDM)]にあるdm:childrenアクセサにより返される。
Note:
子を持つのは文書節点と要素節点だけである。文脈節点がこれ以外の種類の節点であるか、文脈節点が空の文書節点もしくは要素節点であったならば、child軸は空列である。文書節点や要素節点の子は、要素節点、処理命令節点、コメント節点、テキスト節点のいずれかである。属性節点、名前空間節点、文書節点は決して子として出現することはない。
descendant軸はchild軸の推移的閉包として定義される。この軸には文脈節点の子孫
(子、子の子、など) が含まれる。
parent軸は[XQuery/XPath Data
Model
(XDM)]にあるdm:parentアクセサにより返される列を含む。このアクセサは文脈節点の親を返す。ただし、文脈節点が親を持たない場合は空列を返す。
Note:
属性節点はその親として要素節点を持っていてもよい。ただしその場合も、その属性節点はその要素節点の子ではない。
ancestor軸はparent軸の推移的閉包として定義される。この軸には文脈節点の先祖
(親、親の親、など) が含まれる。
Note:
ancestor軸には、文脈節点のある木の根節点が含まれる。ただし、文脈節点が根節点の場合は含まれない。
following-sibling軸は文脈節点の後に続く兄弟を含む。すなわち文脈節点の親の子のうち、文書順で文脈節点の後ろに出現する節点を含む。もし文脈節点が属性節点または名前空間節点であれば、following-sibling軸は空である。
preceding-sibling軸は文脈節点の前にある兄弟を含む。すなわち文脈節点の親の子のうち、文書順で文脈節点より前に出現する節点を含む。もし文脈節点が属性節点または名前空間節点であれば、preceding-sibling軸は空である。
following軸は、文脈節点がある木の根の子孫のうち、文脈節点の子孫ではなく、文書順で文脈節点より後ろに出現するものすべてを含む。
preceding軸は、文脈節点がある木の根の子孫のうち、文脈節点の子孫ではなく、文書順で文脈節点より前に出現するものすべてを含む。
attribute軸は、文脈節点の属性を含む。これらは[XQuery/XPath Data Model
(XDM)]にあるdm:attributesアクセサによって返される節点である。文脈節点が要素でなければ、この軸は空である。
self軸は文脈節点自身のみを含む。
descendant-or-self軸は、文脈節点と、文脈節点の子孫を含む。
ancestor-or-self軸は、文脈節点と、文脈節点の先祖を含む。したがって、ancestor-or-self軸は常に根節点を含む。
namespace軸は、文脈節点の名前空間節点を含む。これらは[XQuery/XPath Data Model
(XDM)]にあるdm:namespace-nodesアクセサにより返される節点である。文脈節点が要素節点でなければ、この軸は空である。namespace節点はXPath
2.0 では推奨されない。もしXPath
1.0互換モードがtrueであれば、namespace軸は支援されなければならない。もしXPath
1.0互換モードがfalseであれば、namespace軸の支援は実装定義である。XPath
1.0互換モードがfalseであるときnamespace軸を支援しない実装では、この軸が使われると静的エラー [err:XPST0010]を発生させなければならない。要素の有効範囲内名前空間に関する情報を必要とするアプリケーションは、[XQuery
1.0 and XPath 2.0 Functions and
Operators]で定義されるfn:in-scope-prefixes関数やfn:namespace-uri-for-prefix関数を使うべきである。
軸は前向き軸と逆向き軸とに分類することができる。文脈節点または文書順で文脈節点より後ろの節点のみ含む軸は、前向き軸である。文脈節点または文書順で文脈節点より前の節点のみ含む軸は、逆向き軸である。
parent軸, ancestor軸,
ancestor-or-self軸, preceding軸,
preceding-sibling軸は逆向き軸である。それ以外の軸はすべて前向き軸である。ancestor軸,
descendant軸, following軸,
preceding軸, self軸は文書を分割する
(属性節点と名前空間節点は無視する)。これらの軸は互いに重複がなく、すべてを合わせると文書中のすべての節点を含む。
[Definition: 軸はそれぞれ主要節点種類を持つ。ある軸が要素を含んでいれば、主要節点種類は要素である。そのほかの場合は、その軸が含むことのできる節点の種類である。] したがって:
attribute軸に対しては、主要節点種類は属性である。
namespace軸に対しては、主要節点種類は名前空間である。
それ以外のすべての軸に対しては、主要節点種類は要素である。
[Definition: 節点テストは、ステップによって選択された節点それぞれについて真にならなければならない条件である。] この条件は、節点の種類 (要素、属性、テキスト、文書、コメント、処理命令)、節点の名前、(要素節点、属性節点、文書節点の場合には) 節点の型注釈に基づいていてもよい。
| [35] | NodeTest |
::= | KindTest | NameTest |
| [36] | NameTest |
::= | QName | Wildcard |
| [37] | Wildcard |
::= | "*" |
[Definition:
QNameまたはワイルドカードのみからなる節点テストを名前テストという。]
名前テストが真になるのは、節点の種類がそのステップの軸の主要節点種類であり、節点の展開済QNameが節点テストで指定されている展開済QNameと
(eq 演算子で定義されているように)
一致するとき、かつそのときに限る。例えば、child::paraは、文脈節点のpara子要素を選択する。文脈節点の子にpara要素がなければ、節点の空集合を選択する。attribute::abc:hrefは、QNameabc:hrefを持つ文脈節点の属性を選択する。文脈節点がそのような属性を持たなければ、節点の空集合を選択する。
節点テスト中のQNameは、式文脈の静的既知名前空間を用いて展開済QNameに解決される。QNameの接頭辞が静的既知名前空間のどれにも一致しなければ、静的エラー [err:XPST0081]である。接頭辞のないQNameは、主要節点種類が要素である軸上で名前テストとして用いられると、式文脈のデフォルト要素/型名前空間の名前空間URIを持つ。これ以外の用いられ方の場合、名前空間URIを持たない。
名前テストの展開済QNameと名前が一致しないような要素節点に対しては、その名前テストは満たされない。たとえその名前がその名付けられた節点を先頭とするような置換グループ中にあったとしても、その名前テストは満たされない。
節点テスト*は、そのステップの軸の主要節点種類であるような任意の節点に対して、真である。例えば、child::*は文脈節点のすべての子要素を選択する。またattribute::*は、文脈節点のすべての属性を選択する。
節点テストはNCName:*という形式を持つことができる。この場合、接頭辞はQNameと同じ方法で展開される。このとき、静的文脈中の静的既知名前空間を用いる。その接頭辞が静的既知名前空間中になければ、静的エラーが発生する [err:XPST0081]。このような形式の節点テストが真になるのは、ステップの軸のうち展開済QNameが接頭辞の束縛されている名前空間URIを持っているものについて、その軸の主要節点種類の任意の節点に対してである。その名前の局所部分には関係しない。
節点テストは*:NCNameという形式を持つこともできる。この場合、節点テストが真になるのは、そのステップの軸の主要節点種類の節点のうち、局所名が与えられたNCNameに一致するものに対してである。節点の名前空間や、節点の名前空間の有無には関係しない。
[Definition: 節点テストのもう一つの形式は種類テストと呼ばれる。これは、節点の種類、名前、型注釈に基づき、節点を選択することができる。] 種類テストの構文と意味についての記述は2.5.3 SequenceTypeの文法と2.5.4 SequenceTypeの照合にある。種類テストが節点テスト内で用いられるとき、指定された軸上の節点のうち、その種類テストに照合されるものだけが選択される。以下に示すのは、経路式中で用いられている種類テストの例のいくつかである。
node()は任意の節点に照合される。
text()は任意のテキスト節点に照合される。
comment()は任意のコメント節点に照合される。
element()は任意の要素節点に照合される。
schema-element(person)は、要素節点のうち、名前がperson
(またはpersonを先頭とする置換グループに含まれる)であり、型注釈が有効範囲内要素定義中のperson要素の定義型と同じ(もしくは導出される)であるようなものに照合される。
element(person)は、要素節点のうち、名前がpersonであるようなものに照合される。その節点の型注釈には関係しない。
element(person,
surgeon)は、nillでない要素節点のうち、名前がpersonであり、型注釈がsurgeonまたはsurgeonから導出されるものに照合される。
element(*,
surgeon)は、nillでない要素節点のうち、型注釈がsurgeon
(またはsurgeonから導出される)であるようなものに照合される。その節点の名前には関係しない。
attribute()は任意の属性節点に照合される。
attribute(price)は、属性節点のうち名前がpriceであるものに照合される。その節点の型注釈には関係しない。
attribute(*,
xs:decimal)は属性節点のうち型注釈がxs:decimalである
(またはxs:decimalから導出される) ものに照合される。その節点の名前には関係しない。
document-node()は任意の文書節点に照合される。
document-node(element(book))は、文書節点のうち内容が種類テスト
element(book)を満たす単一要素節点と、0個以上のコメントや処理命令が交差しているようなものに照合される。
| [40] | Predicate |
::= | "[" Expr "]" |
[Definition: 述語は式からなり、角括弧で囲まれる。この式のことを述語式という。述語は、列を選別し、いくつかの項目を残し他の項目を捨てる機能を提供する。] 複数の隣接する述語の場合は、述語が左から右に適用され、それぞれの述語を適用した結果が次に続く述語の入力列になる。
入力列のそれぞれの項目に対して、述語式は 内部焦点 を用いて以下のように評価される: 文脈項目は、その述語によって現在評価されている項目である。文脈サイズは入力列中の項目数である。文脈位置は、入力列中の文脈項目の位置である。述語中での文脈位置を評価する目的で、入力列は以下のように整列されているとみなす: 述語が前向き軸のステップ中にあるなら文書順、述語が後ろ向き軸のステップ中にあるなら逆文書順、述語がステップ内にないなら元の順である。
入力列の項目それぞれに対して、
述語式の結果はxs:booleanの値に強制される。この値を述語真偽値といい、以下の通りになる。述語真偽値がtrueであるような項目が残され、述語真偽値がfalseであるような項目が捨てられる。
述語真偽値は以下のルールを順に適用することで導出される。
述語式の値が数型または数型から導出される型の単一値列原子値であるなら、述語真偽値は次のようになる。述語式の値が(eq演算子によって)文脈位置と等しい場合はtrue、それ以外の場合はfalseになる。
[Definition: 述語式が数型を返す述語を数述語という。]
これ以外の場合は、述語真偽値は、その述語式の有効ブール値である。
以下に、述語を含む軸ステップの例をいくつか示す。
この例は、文脈節点の子要素のうち、2番目のchapter要素を選択する。
child::chapter[2]
この例は、文脈節点の子孫のうち、名前が"toy"であり、そのcolor属性の値が"red"であるような要素を選択する。
descendant::toy[attribute::color = "red"]
この例は、文脈節点のemployee子要素のうち、secretary子要素とassistant子要素をともに持つものを選択する。
child::employee[secretary][assistant]
Note:
逆向き軸を用いて選択された節点列に述語を用いる場合、このような列の文脈位置は逆文書順に割り当てられることを覚えておくことが重要である。例えば、preceding::foo[1]は逆文書順に最初に限定されるfoo要素を返す。なぜなら、この述語は逆向き軸を用いた軸ステップの一部であるからである。一方、(preceding::foo)[1]は文書順に最初に限定されるfoo要素を返す。なぜなら、括弧によって(preceding::foo)が優先式と解釈され、この式の中で文脈位置が文書順に割り当てられるからである。同様に、ancestor::*[1]は最も近い先祖要素を返す。なぜならancestor軸は逆向き軸であるからである。一方(ancestor::*)[1]は根要素
(文書順で最初の先祖) を返す。
後ろ向き軸のステップでは述語を評価する目的で文脈位置が逆文書順で割り当てられているという事実があっても、ステップの最終結果は常に文書順であるという事実は変わらない。
この節では経路式の例をいくつか出すが、これらは、各ステップで軸が明示的に指定されている。これらの例で用いられている構文は非省略構文と呼ばれる。多くの場合に共通して、省略構文を用いて経路式をより簡潔に書くことが可能である。この構文については3.2.4 省略構文で説明する。
child::paraは文脈節点の子であるpara要素を選択する。
child::*は文脈節点の子である要素すべてを選択する。
child::text()は文脈節点の子であるテキスト節点すべてを選択する。
child::node()は、文脈節点の子すべてを選択する。属性節点は返されないことに注意すること。なぜなら属性は子ではないからである。
attribute::nameは文脈節点のname属性を選択する。
attribute::*は、文脈節点の属性すべてを選択する。
parent::node()は、文脈節点の親を選択する。文脈節点が属性節点であれば、この式はその属性が付けられている要素節点
(もしあれば) を返す。
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::list/child::memberは、list要素を親とするmember要素で、文脈節点と同じ文書中にあるものすべてを選択する。
child::para[fn:position() =
1]は、文脈節点の子のうち最初のpara要素を選択する。
child::para[fn:position() =
fn:last()]は、文脈節点の子のうち最後のpara要素を選択する。
child::para[fn:position() =
fn:last()-1]は、文脈節点の子のうち最後から2番目のpara要素を選択する。
child::para[fn:position() >
1]は、文脈要素の子のpara要素のうち、1番目以外のものをすべて選択する。
following-sibling::chapter[fn:position() =
1]は、文脈要素の弟のchapterのうち、最初に出現するものを選択する。
preceding-sibling::chapter[fn:position() =
1]は、文脈要素の兄のchapterのうち、直前に出現するものを選択する。
/descendant::figure[fn:position() =
42]は、文脈要素を含む文書中で42番目に出現するfigureを選択する。
/child::book/child::chapter[fn:position() =
5]/child::section[fn:position() =
2]は、文脈要素を含む文書節点を親とするbookの5番目のchapterの2番目のsectionを選択する。
child::para[attribute::type eq
"warning"]は、文脈要素の子のparaのうち、type属性を持ち、その値がwarningであるようなものをすべて選択する。
child::para[attribute::type eq 'warning'][fn:position() =
5]は、文脈節点のpara子要素で、type属性を持ち、その値がwarningであるようなものの5番目のものを選択する。
child::para[fn:position() = 5][attribute::type eq
"warning"]は、文脈節点の子のうち5番目のpara要素を選択する。ただし、その要素がtype属性を持ち、その値がwarningである場合に限られる。
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][fn:position() =
fn:last()]は、文脈節点の子のchapterまたはappendixのうち、最後のものを選択する。
| [31] | AbbrevForwardStep |
::= | "@"? NodeTest |
| [34] | AbbrevReverseStep |
::= | ".." |
省略構文では、次の省略記法が認められる。
attribute軸attribute::は@と略記できる。例えば、経路式para[@type="warning"]はchild::para[attribute::type="warning"]の短縮形であり、para子要素のうち、type属性を持ち、その値がwarningであるようなものを選択する。
軸ステップから軸名が省略されると、軸ステップがAttributeTestまたは SchemaAttributeTest
を含まない限り、デフォルトの軸はchildになる。AttributeTestを含む場合は、デフォルトの軸はattributeになる。例えば、経路式section/paraはchild::section/child::paraの省略形であり、経路式section/@idはchild::section/attribute::idの省略形である。同様に、section/attribute(id)はchild::section/attribute::attribute(id)の省略形である。後者の式は軸指定と節点テストをともに含んでいることに注意せよ。
経路式の処理中、先頭以外に出現する//は/descendant-or-self::node()/に置き換えられる。例えば、div1//paraはchild::div1/descendant-or-self::node()/child::paraの短縮形であり、div1子要素のpara子孫要素を選択する。
Note:
経路式//para[1]は、経路式/descendant::para[1]と同じであるということを意味しない。後者は、最初のpara子孫要素を選択する。前者はpara子孫要素のうち、その親の最初のpara子要素であるものをすべて選択する。
..からなるステップはparent::node()の短縮形である。例えば、../titleはparent::node()/child::titleの短縮形であり、文脈節点の親のtitle子要素を選択する。
Note:
式.は、文脈項目式と呼ばれ、基本式である。これについての説明は3.1.4 文脈項目式にある。
以下に示すのは、省略構文を用いた経路の例である。
paraは、文脈節点のpara子要素を選択する。
*は、文脈節点の子要素すべてを選択する。
text()は、文脈節点の子であるテキスト節点すべてを選択する。
@nameは、文脈節点のname属性を選択する。
@*は、文脈節点の属性すべてを選択する。
para[1]は、文脈節点のpara子要素のうち最初のものを選択する。
para[fn:last()]は、文脈節点のpara子要素のうち最後のものを選択する。
*/paraは、文脈節点のpara孫要素すべてを選択する。
/book/chapter[5]/section[2]は、文脈節点を含む文書節点を親とするbookの5番目のchapterの2番目のsectionを選択する。
chapter//paraは、文脈節点のchapter子要素の子孫であるpara要素を選択する。
//paraは、根である文書節点の子孫のparaをすべて選択する。すなわち、文脈節点と同じ文書内にあるすべてのpara要素を選択する。
//@versionは、文脈節点と同じ文書内にあるすべてのversion属性を選択する。
//list/memberは、文脈節点と同じ文書内にあるmember要素のうち、listを親に持つものをすべて選択する。
.//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子要素のうち、1個以上のtitle子要素を持つものを選択する。
employee[@secretary and
@assistant]は、文脈節点のemployee子要素のうち、secretary属性とassistant属性をともに持つものをすべて選択する。
book/(chapter|appendix)/sectionは、section要素のうち親がchapter要素かappendix要素のいずれかであり、さらにそれが文脈節点の子のbookの子であるようなものを選択する。
Eが節点列を返す式であるとき、式E/.は同じ節点列を文書順で返す。ただし、節点の識別性に基づき重複が除去される。
XPathは項目の列を構成したり選別したり結合したりする演算を支援している。列は決して入れ子にならない。例えば、値1,
(2, 3), ( )を結合して1つの列にすると、結果は列(1, 2,
3)になる。
| [2] | Expr |
::= | ExprSingle (","
ExprSingle)* |
| [11] | RangeExpr |
::= | AdditiveExpr ( "to"
AdditiveExpr )? |
[Definition: 列を構成する1つの方法は、コンマ演算子を用いるというものである。この演算子は演算数をそれぞれ評価し、結果の列を順に連接し、1つの列を結果とする。] 空の括弧は空列を表すのに用いることができる。
列は原子値や節点を重複して含んでいてもよいが、列が別の列の項目になることは決してない。2つ以上の入力列を連接して新たな列を生成する場合、新たな列は、入力列の項目すべてを含み、かつその長さは入力列の長さの総和になる。
Note:
関数呼び出しの引数など、文法中でExprSingleが必要とされる場所では、最上位のコンマ演算子を含む式はすべて括弧で囲まなければならない。
列を構成する式の例をいくつか示す。
この式の結果は、5つの整数の列である。
(10, 1, 2, 3, 4)
この式はそれぞれ長さ1, 2, 0, 2である4つの列を結合し、長さ5の1つの列にする。この式の結果は列10, 1,
2, 3, 4になる。
(10, (1, 2), (), (3, 4))
この式の結果は、文脈節点のすべてのsalary子節点の後ろにすべてのbonus子節点が続くような列である。
(salary, bonus)
$priceが値10.50に束縛されているとすると、この式の結果は列10.50,
10.50である。
($price, $price)
範囲式は連続した整数の列を構成するのに用いることができる。to演算子の演算数はそれぞれ、期待される引数の型がxs:integer?であるような関数の引数であるかのように、変換される。いずれかの演算数が空列であるか、第1演算数から導出される整数が第2演算数から導出される整数より大きければ、範囲式の結果は空列である。2つの演算数の変換結果が同じ整数になれば、範囲式の結果はその整数である。それ以外の場合は、結果は、2つの整数演算数、および2つの演算数の間の整数すべてからなる列であり、昇順に並べられる。
この例では、列を構成する演算数の1つに範囲式を用いている。これを評価すると列10, 1, 2, 3,
4になる。
(10, 1 to 4)
この例では、1つの整数10を含む長さ1の列を構成している。
10 to 10
この例の結果は長さ0の列である。
15 to 10
この例では、fn:reverseを用いて6つの整数の降順列を構成している。これを評価すると列15,
14, 13, 12, 11, 10となる。
fn:reverse(10 to 15)
| [38] | FilterExpr |
::= | PrimaryExpr PredicateList |
| [39] | PredicateList |
::= | Predicate* |
[Definition: 選別式は、単に、1つの基本式の後ろに0個以上の述語が続くものである。選別式の結果は、基本式によって返される項目のうち、それぞれの述語を左から右に順に適用することで選別を行ったものである。] 述語が全く指定されなければ、結果は単に基本式の結果である。選別式によって返される項目の順序は、基本式の結果の順序と同じである。項目に割り当てられる文脈位置は、結果の列中の順序位置に基づいて決められる。最初の文脈位置は1である。
選別式の例を以下に示す。
productsの列が変数で与えられているとすると、これらのproductsのうちpriceが100以上のものを返す。
$products[price gt 100]
1から100までの整数のうち5で割り切れるものをすべて列挙する(to演算子についての説明は3.3.1 列の構成を見よ)。
(1 to 100)[. mod 5 eq 0]
以下の式の結果は整数25である。
(21 to 29)[5]
以下の例は、変数 $orders に束縛されている列の5番目から9番目までを返す。
$orders[fn:position() = (5 to 9)]
次に示すのは、選別式を経路式のステップとして用いている例である。これは、変数$bookに束縛されている本の中からchapterまたはappendixのうち最後のものを返す。
$book/(chapter | appendix)[fn:last()]
次に示すのも、選別式を経路式のステップとして用いている例である。これは、指定された文書中の要素節点のうち、IDの値がtigerであるようなものを返す。
fn:doc("zoo.xml")/fn:id('tiger')
| [14] | UnionExpr |
::= | IntersectExceptExpr ( ("union"
| "|") IntersectExceptExpr
)* |
| [15] | IntersectExceptExpr |
::= | InstanceofExpr (
("intersect" | "except") InstanceofExpr )* |
XPathでは、節点列を結合する演算として次のようなものを用意している。
union演算子と|演算子は等価である。これらは2つの節点列を演算数として取り、いずれかの演算数中に出現するすべての節点を含む列を返す。
intersect演算子は2つの節点列を演算数として取り、どちらの演算数にも出現するすべての節点を含む列を返す。
except演算子は2つの節点列を演算数として取り、第1演算数には出現するが第2演算数には出現しない節点をすべて含む列を返す。
これらの演算子はすべて、節点の識別性に基づき結果の列から重複した節点を取り除く。結果の列は文書順で返される。
union, intersect,
exceptの演算数が節点でない項目を含んでいたならば、型エラーが発生する [err:XPTY0004]。
以下に、列を結合する式の例をいくつか示す。3つの要素節点が存在すると仮定しよう。これらをA, B,
Cという記号名で参照する。また、変数$seq1, $seq2,
$seq3が、先に挙げた節点からなる以下のような列に束縛されていると仮定する。
$seq1は (A, B) に束縛されている
$seq2は (A, B) に束縛されている
$seq3は (B, C)に束縛されている
このとき:
$seq1 union $seq2を評価すると列 (A, B) になる。
$seq2 union $seq3を評価すると列 (A, B, C) になる。
$seq1 intersect $seq2を評価すると列 (A, B) になる。
$seq2 intersect $seq3を評価すると B のみを含む列になる。
$seq1 except $seq2を評価すると空列になる。
$seq2 except $seq3を評価すると A のみを含む列になる。
ここで述べた列に関する演算子に加えて、[XQuery 1.0 and XPath 2.0 Functions and Operators]には、添字を通して項目や列の部分列にアクセスするための関数、添字を通して列中から項目を削除したり列中に項目を挿入するための関数、列から重複した項目を削除するための関数がある。
XPathは、加算、減算、乗算、除算、法などの算術演算子を、通常の単項や二項の形で用意している。
| [12] | AdditiveExpr |
::= | MultiplicativeExpr ( ("+" |
"-") MultiplicativeExpr
)* |
| [13] | MultiplicativeExpr |
::= | UnionExpr ( ("*" |
"div" | "idiv" | "mod") UnionExpr )* |
| [20] | UnaryExpr |
::= | ("-" | "+")* ValueExpr |
| [21] | ValueExpr |
::= | PathExpr |
減算演算子の前には空白を置かなければならない。そうしなければ、直前の字句の一部と解釈されることがある。例えば、a-bは1つの名前と解釈されるが、a
- bやa -bは算術式と解釈される。(空白処理の詳細はA.2.4 空白規則を見よ。)
算術式の評価は、まず演算数を評価することから始まる。演算数を評価する順番は実装依存である。
XPath 1.0
互換モードがtrueであれば、各演算数は以下のステップを順に適用することで評価される。
原子化が演算数に適用される。この操作の結果は原子化済演算数と呼ばれる。
原子化済演算数が空列であれば、算術式の結果はxs:doubleの値NaNであり、実装は他の演算数を評価したり、演算子を適用したりする必要はない。しかし実装は、エラーが発生するか決めるために他の演算子を評価することを選択してもよい。
原子化済演算数が長さ1以上の列であれば、その列の先頭の項目から後ろの項目は捨てられる。
この結果、原子化済演算数がxs:boolean型, xs:string型,
xs:decimal型 (xs:integerを含む),
xs:float型,
xs:untypedAtomic型のいずれかのインスタンスになれば、fn:number関数を適用することでxs:doubleに変換される。(fn:numberは、演算数が数に変換できない場合は値NaNを返すことに注意せよ。)
XPath 1.0
互換モードがfalseであれば、各演算数は以下のステップを順に適用することで評価される。
原子化が演算数に適用される。この操作の結果は原子化済演算数と呼ばれる。
原子化済演算数が空列であれば、算術式の結果は空列であり、実装は他の演算数を評価したり、演算子を適用したりする必要はない。しかし実装は、エラーが発生するか決めるために他の演算子を評価することを選択してもよい。
原子化済演算数が長さ1より大きい列であれば、型エラーが発生する [err:XPTY0004]。
原子化済演算数がxs:untypedAtomic型であれば、xs:doubleに型変換される。型変換に失敗すれば、動的エラーが発生する。 [err:FORG0001]
演算数の評価の後、演算数の型が与えられた算術演算子について正しい組み合わせであれば、演算子が演算数に適用される。結果は、原子値または動的エラーとなる。 (例えば、0で除算を行った結果はエラーになるかもしれない。) さまざまな算術演算子に受け入れられる原子型の組み合わせ、算術演算子の結果として期待される型についてはB.2 演算子の写像に列挙されている。ここには、それぞれの型の組み合わせに対して演算子の意味を定義する演算子関数についても記述がある。演算子関数の定義は[XQuery 1.0 and XPath 2.0 Functions and Operators]にある。
演算数の型が、評価の後、与えられた演算子について正しい組み合わせでないならば、B.2 演算子の写像のルールに従って、型エラーが発生する [err:XPTY0004]。
XPathはdivとidivという2種類の除算演算子を支援する。これらの演算子は、2つの演算数として任意の数型の値を許す。[XQuery 1.0 and XPath 2.0 Functions and
Operators]の説明の通り、$arg1 idiv $arg2は($arg1 div
$arg2) cast as xs:integer?と等しい。ただしエラーの場合は除く。
以下に、算術式の例をいくつか示す。
以下の最初の式はxs:decimalの値-1.5を返し、2番目の式はxs:integerの値-1を返す。
-3 div 2 -3 idiv 2
2つの日付値の差の結果はxs:dayTimeDuration型の値になる。
$emp/hiredate - $emp/birthdate
この例は減算演算子とハイフンの違いを示している。
$unit-price - $unit-discount
単項演算子は二項演算子より優先度が高い。もちろんこれは、括弧の利用に左右される。従って、次の2つの例は異なる意味となる。
-$bellcost + $whistlecost -($bellcost + $whistlecost)
Note:
[XPath 1.0]との互換性のため、XPathでは複数の単項算術演算子が連続して出現することが許される。
比較式は、2つの値を比較することを許す。XPathは、3種類の比較式を用意している。それぞれ、値比較、汎用比較、節点比較という。
| [10] | ComparisonExpr |
::= | RangeExpr ( (ValueComp |
| [23] | ValueComp |
::= | "eq" | "ne" | "lt" | "le" | "gt" | "ge" |
| [22] | GeneralComp |
::= | "=" | "!=" | "<" | "<=" | ">" |
">=" |
| [24] | NodeComp |
::= | "is" | "<<" | ">>" |
Note:
XPath式がXML文書中に書かれる場合は、特殊文字に関するXMLのエスケープルールに従わなければならない。従って、"<"
は "<" と書き換えられなければならない。
値比較演算子はeq, ne, lt,
le, gt,
geである。値比較は単一値を比較するのに用いられる。
値比較の評価で最初に行われるのは演算数の評価である。演算数が評価される順番は実装依存である。各演算数は以下のステップを順に適用することで評価される。
原子化が演算数に対して適用される。この操作の結果は原子化済演算数と呼ばれる。
原子化済演算数が空列であれば、値比較の結果は空列であり、実装は、他の演算数を評価したり演算子を適用したりする必要はない。しかし実装は、エラーが発生するかどうかを決定するために他の演算数を評価することを選択してもよい。
原子化済演算数が長さ1より大きい列であれば、型エラーが発生する [err:XPTY0004]。
原子化済演算数がxs:untypedAtomic型であれば、xs:stringに型変換される。
Note:
このルールの目的は、値比較を推移的にするためである。利用者は、汎用比較演算子はxs:untypedAtomic演算数に関する別の型変換ルールを持っていることに気づくべきである。また利用者は、型変換での正確さを犠牲にすることで、値比較の推移性が妥協されてもよいということにも気づくべきである
(例えば、ほんの少し異なる2つのxs:integerの値は、xs:floatがxs:intergerよりも正確さに欠けるために、同じxs:floatの値だとみなされてもよい)。
次に、可能ならば、型の昇格や部分型置換によって2つの演算数がそれらの最小共通型に変換される。例えば、演算数が
hatsize 型 (xs:integer から導出される) と
shoesize 型 (xs:float から導出される)
であれば、それらの最小共通型は xs:float である。
最後に、演算数の型が与えられた演算子について正しい組み合わせであれば、演算子が演算数に対して適用される。さまざまな値比較演算子について、認められる原子型の組み合わせや、その演算子の結果として期待される型はB.2 演算子の写像にある。ここではまた演算子関数についても記述されている。これは、型の組み合わせそれぞれに対して演算子の意味を定義するものである。演算子関数の定義は[XQuery 1.0 and XPath 2.0 Functions and Operators]にある。
直観的には、2つの原子化済演算数がともにまったく1つの原子値からなっているならば、比較の結果は次のようになる。もし第1演算数の値が第2演算数の値
(に等しい, に等しくない, より小さい, より小さいか等しい, より大きい, より大きいか等しい)
ならば、結果はtrueである。それ以外の場合には、比較の結果はfalseである。
演算数を評価した後、その演算数の型が与えられた演算数について正しくない組み合わせであれば、B.2 演算子の写像のルールに従って、型エラーが発生する [err:XPTY0004]。
以下に、値比較の例をいくつか示す。
次の比較は、式$book/authorによって返される節点を原子化する。比較が真になるのは、原子化の結果がxs:stringまたはxs:untypedAtomicのインスタンスとしての値
"Kennedy"
である場合だけである。原子化の結果が空列であれば、比較の結果は空列になる。原子化の結果が2個以上の値を含む列であれば、型エラーが発生する [err:XPTY0004]。
$book1/author eq "Kennedy"
次の経路式は、重さが100以上の製品を選択する述語を含む。weight部分要素を持たない製品については、この述語の値は空列であり、その製品は選択されない。この例では、weight
は検証された要素であり、数型であると仮定している。
//product[weight gt 100]
次の比較が真になるのは、my:hatsizeとmy:shoesizeがともに、原子型numericから制限によって導出されるユーザ定義型である場合である。
my:hatsize(5) eq my:shoesize(5)
以下の比較は true である。eq は2つの QName について、それらの名前空間 URI
と局所名をコード位置により比較を行うことにより、比較する。名前空間接頭辞は無視する。
fn:QName("http://example.com/ns1", "this:color")
eq fn:QName("http://example.com/ns1", "that:color")
汎用比較演算子は=, !=, <,
<=, >,
>=である。汎用比較は存在限量比較であり、任意の長さの列の演算数に適用してもよい。汎用比較の結果は、エラーが発生しないときは常にtrueかfalseである。
XPath
1.0互換モードがtrueであれば、汎用比較は以下のルールを順に適用することで評価される。
どちらかの演算数が単一の原子値かつxs:booleanのインスタンスであれば、もう一方の演算数は、その有効ブール値を取ることによりxs:booleanに変換される。
原子化がそれぞれの演算数に適用される。原子化の結果、各演算数は原子値の列になる。
比較演算子が<, <=, >,
>=であれば、両演算数の列中の各項目が、fn:number関数を適用することにより、xs:doubleに変換される。
(fn:numberは、演算数が数に変換できない場合は値NaNを返すことに注意せよ。)
比較の結果は次のようになる。原子値の組で、一方が第1演算数の列、もう一方が第2演算数の列であり、要求される大小関係を持っているものがあれば、結果はtrueである。そうでなければ、比較の結果はfalseである。2つの原子値間の大小関係は以下のルールを適用することで決定される。これらのルールから呼び出したcast演算子が成功しなければ、動的エラーが発生する。
[err:FORG0001]
2つの原子値のうち少なくとも一方が数型のインスタンスであれば、原子値はともに、fn:number関数を適用することにより、xs:double型に変換される。
2つの原子値のうち少なくとも一方がxs:stringのインスタンスであるか、原子値がともにxs:untypedAtomicのインスタンスであれば、原子値はともにxs:string型に型変換される。
原子値の一方がxs:untypedAtomicのインスタンスであり、もう一方がxs:string,
xs:untypedAtomic, あるいはどの数型のいずれでもなければ、xs:untypedAtomicの値が、もう一方の値の動的型に型変換される。
上に述べた変換を行った後、値比較演算子eq, ne,
lt, le, gt,
geのいずれか一つを用いて原子値が比較される。どれを用いるかは、汎用比較演算子が=,
!=, <, <=,
>,
>=のどれであったかに依存する。値が要求された大小関係を持っているのは、この値比較の結果がtrueであるとき、かつそのときに限る。
XPath
1.0互換モードがfalseのとき、汎用比較は以下のルールを順に適用することで評価される。
原子化が各演算数に適用される。原子化の結果、各演算数は原子値の列になる。
比較の結果がtrueになるのは、原子値の組が存在し、その1つは第1演算数の列、もう一方が第2演算数の列であり、それらが要求された大小関係を持っているとき、かつその時に限る。それ以外の場合には、比較の結果はfalseになる。2つの原子値間の大小関係は、以下のルールを順に適用することで決定される。これらのルールによって呼び出されるcast演算子が成功しなければ、動的エラーが発生する。
[err:FORG0001]
原子値のいずれか1つがxs:untypedAtomicのインスタンスであり、もう一方が数型のインスタンスであれば、xs:untypedAtomicの値がxs:double型に型変換される。
原子値のいずれか1つがxs:untypedAtomicのインスタンスであり、もう一方がxs:untypedAtomicまたはxs:stringのインスタんであれば、xs:untypedAtomicの値
(または両方) がxs:string型に型変換される。
原子値のいずれか1つがxs:untypedAtomicのインスタンスであり、もう一方がxs:string,
xs:untypedAtomic, または任意の数型のどれでもなければ、xs:untypedAtomicの値がもう一方の動的型に型変換される。
上に述べた変換を行った後、値比較演算子eq, ne,
lt, le, gt,
geのいずれかを用いて原子値が比較される。どれを用いるかは、汎用比較演算子が=,
!=, <, <=,
>,
>=のどれであったかに依存する。値が、要求される大小関係を持つのは、この値比較の結果がtrueである場合、かつその時に限る。
いずれかの演算数が項目の列である汎用比較を評価するとき、実装は、第1演算数と第2演算数から、要求される大小関係を持つ項目を1つずつ見つけると直ちにtrueを返してもよい。同様に、汎用比較は、いずれかの演算数を評価しているときや2つの演算数から選んだ項目の組を比較するときにエラーが生じれば、直ちに動的エラーを発生してもよい。これらのルールの結果として、エラーが存在するときには、汎用比較の結果は決定的ではない。
以下に、汎用比較の例をいくつか示す。
以下の比較は、$book1の任意の部分要素authorについて、その型付けされた値がxs:stringまたはxs:untypedAtomicのインスタンスとしての
"Kennedy" であるとき、trueになる。
$book1/author = "Kennedy"
以下の例は3つの汎用比較を含む。初めの2つの比較の値はtrueであり、3つ目の比較の値はfalseである。この例は、汎用比較は推移的ではないという事実を示している。
(1, 2) = (2, 3) (2, 3) = (3, 4) (1, 2) = (3, 4)
以下の例は2つの汎用比較を含む。これらはいずれもtrueである。この例は、=と!=は互いに逆ではないという事実を示している。
(1, 2) = (2, 3) (1, 2) != (2, 3)
$a, $b,
$cがそれぞれ、型注釈xs:untypedAtomicを持ち、文字列値 "1",
"2"、および"2.0" を持つ要素節点に束縛されているとする。このとき
($a, $b) = ($c,
3.0)はfalseを返す。なぜなら$bと$cは文字列として比較されるためである。しかし($a,
$b) = ($c,
2.0)はtrueを返す。なぜなら$bと2.0は数として比較されるためである。
節点比較は、2つの節点を識別性または文書順に基づいて比較するのに用いられる。節点比較の結果は以下のルールにより定義される。
節点比較の演算数が実装依存の順で評価される。
各演算数は単一の節点か空列でなければならない。そうでない場合は型エラーが発生する [err:XPTY0004]。
いずれかの演算数が空列であれば、比較の結果は空列であり、実装は他の演算数を評価したり演算子を適用したりする必要はない。しかし実装は、エラーが発生するかどうかを決定するために他の演算数を評価することを選択してもよい。
is演算子による比較がtrueを返すのは、2つの演算数が同じ識別性を持っており、したがって同じ節点である場合である。そうでない場合はfalseを返す。節点の識別性の定義は[XQuery/XPath
Data Model (XDM)]を見よ。
<<演算子による比較がtrueを返すのは、左側の演算数が右側の演算数より文書順で前にある場合である。そうでない場合はfalseを返す。
>>演算子による比較がtrueを返すのは、左側の演算数が右側の演算数より文書順で後ろにある場合である。そうでない場合はfalseを返す。
以下に、節点比較の例をいくつか示す。
次の比較が真になるのは、左辺と右辺を評価した結果がそれぞれ完全に同じ単一節点になる場合のみである。
/books/book[isbn="1558604820"] is /books/book[call="QA76.9 C3845"]
次の比較が真になるのは、左辺によって識別される節点が、右辺によって識別される節点よりも文書順で前に出現する場合のみである。
/transactions/purchase[parcel="28-451"] << /transactions/sale[parcel="33-870"]
論理式はand式かor式のいずれかである。ある論理式がエラーを発生しない場合、結果は常にブール値trueかfalseのいずれかである。
| [8] | OrExpr |
::= | AndExpr ( "or" AndExpr )* |
| [9] | AndExpr |
::= | ComparisonExpr (
"and" ComparisonExpr
)* |
論理式の評価は、まず各演算数の有効ブール値を見つけることから始まる (2.4.3 有効ブール値を見よ)。
and式の値は、演算数の有効ブール値 (EBV) により、次の表のように決定される。
| AND: | EBV2 = true |
EBV2 = false |
EBV2でエラー |
EBV1 = true |
true |
false |
エラー |
EBV1 = false |
false |
false |
XPath
1.0互換モードがtrueであれば、false。そうでない場合はfalseかエラー。 |
| EBV1でエラー | エラー | XPath
1.0互換モードがtrueであれば、エラー。そうでない場合はfalseかエラー |
エラー |
or式の値は、演算数の有効ブール値 (EBV) により、次の表にあるように決定される。
| OR: | EBV2 = true |
EBV2 = false |
EBV2でエラー |
EBV1 = true |
true |
true |
XPath
1.0互換モードがtrueであれば、true。そうでない場合はtrueかエラー |
EBV1 = false |
true |
false |
エラー |
| EBV1でエラー | XPath
1.0互換モードがtrueであれば、エラー。そうでない場合はtrueかエラー。 |
エラー | エラー |
XPath
1.0互換モードがtrueであれば、論理式の演算数を評価する順番が事実上決定される。特に、結果を決定するのに第2演算数を評価する必要がないとき、第2演算数を評価した結果エラーが発生する必要はない。
XPath
1.0互換モードがfalseであれば、論理式の演算数を評価する順番は実装依存である。この場合、or-式は、1番目の式を評価するとtrueになれば、trueを返すことができる。また1番目の式を評価するとエラーが発生した場合、エラーを発生することができる。同様に、and式は、1番目の式を評価するとfalseになれば、falseを返すことができる。また1番目の式を評価するとエラーが発生した場合、エラーを発生することができる。これらのルールの結果として、論理式は、エラーが存在する場合、非決定的である。その例を以下に示す。
以下に、論理式の例をいくつか示す。
次の式はtrueを返す。
1 eq 1 and 2 eq 2
1 eq 1 or 2 eq 3
次の式はfalseを返すか動的エラーを発生する (XPath
1.0 互換モードでは、結果はfalseでなければならない)。
1 eq 2 and 3 idiv 0 = 1
次の式はtrueを返すか動的エラーを発生する (XPath
1.0互換モードでは、結果はtrueでなければならない)。
1 eq 1 or 3 idiv 0 = 1
次の式は動的エラーを発生しなければならない。
1 eq 1 and 3 idiv 0 = 1
and式、or式に加え、XPathはfn:notという関数を用意している。これは引数として一般の列をとり、ブール値を返す。fn:not関数の定義は[XQuery
1.0 and XPath 2.0 Functions and
Operators]にある。fn:not関数は、引数を有効ブール値に縮退する。そして、引数の有効ブール値がfalseであればtrueを返し、引数の有効ブール値がtrueであればfalseを返す。引数の有効ブール値を求める際にエラーが起これば、fn:notは同じエラーを発生する。
XPathはfor式と呼ばれる繰り返し機能を用意している。
| [4] | ForExpr |
::= | SimpleForClause
"return" ExprSingle |
| [5] | SimpleForClause |
::= | "for" "$" VarName "in"
ExprSingle ("," "$" VarName "in" ExprSingle)* |
for式は以下のように評価される。
for式が複数の変数を用いていれば、まず、入れ子のfor式の集合に展開される。これらはそれぞれ、ただ1つの変数しか用いない。例えば、式
for $x in X, $y in Y return $x + $y は for $x in
X return for $y in Y return $x + $yと展開される。
1つの変数を用いるfor式では、その変数を範囲変数、キーワードinに続く式の値を束縛列、キーワードreturnに続く式の値をreturn式という。for式の結果は、束縛列中の項目それぞれに対しreturn式を1回評価することで得られる。このとき範囲変数は束縛列中のその項目に束縛される。結果の列は、それが導出された束縛列中の項目の順に
(コンマ演算子を用いたように) 連接される。
次に示すのは、for式を入力文書の再構成に用いた例である。この例では、以下の入力を基にしている。
<bib>
<book>
<title>TCP/IP Illustrated</title>
<author>Stevens</author>
<publisher>Addison-Wesley</publisher>
</book>
<book>
<title>Advanced Programming in the Unix Environment</title>
<author>Stevens</author>
<publisher>Addison-Wesley</publisher>
</book>
<book>
<title>Data on the Web</title>
<author>Abiteboul</author>
<author>Buneman</author>
<author>Suciu</author>
</book>
</bib>
以下の例では、この入力文書を、各著者の名前が1回ずつ出現し、その著者による本の題目のリストが続くようなリストに変換する。この例では、文脈項目が入力文書中のbib要素であると仮定している。
for $a in fn:distinct-values(book/author)
return (book/author[. = $a][1], book[author = $a]/title)
上の式の結果は以下のような要素の列からなる。与えられた著者による本の題目が、その著者の名前に続いている。結果中のauthor要素の順序は実装依存であり、fn:distinct-values関数の意味に依存している。
<author>Stevens</author> <title>TCP/IP Illustrated</title> <title>Advanced Programming in the Unix environment</title> <author>Abiteboul</author> <title>Data on the Web</title> <author>Buneman</author> <title>Data on the Web</title> <author>Suciu</author> <title>Data on the Web</title>
次に示すのは、1つ以上の変数を含むfor式の例である。
for $i in (10, 20),
$j in (1, 2)
return ($i + $j)
上の式の結果は数の列として表現され、以下の通りである: 11, 12, 21, 22
for式中で束縛された変数の有効範囲は、for式の部分式のうち変数の束縛より後ろに出現するものすべてから構成される。有効範囲には、その変数が束縛される式は含まれない。以下に示すのは、変数束縛が、同じfor式中でそれより前に束縛された別の変数を参照してもよいという例である。
for $x in $z, $y in f($x)
return g($x, $y)
Note:
for式のreturn節の評価のための焦点は、そのfor式の評価のための焦点そのものに等しい。次の例では、order-item
の集合の合計値を求めようとしているのだが、先に述べたような理由で誤りである。
fn:sum(for $i in order-item return @price * @qty)
代わりに、この式は、for節の中で束縛される変数を用いて書かれなければならない。
fn:sum(for $i in order-item
return $i/@price * $i/@qty)
XPathはキーワードif, then,
elseに基づく条件式を支援する。
| [7] | IfExpr |
::= | "if" "(" Expr ")" "then"
ExprSingle "else" ExprSingle |
キーワードifに続く式をテスト式という。またキーワードthenやelseに続く式をそれぞれthen式、else式という。
条件式を処理する最初の段階は、テスト式の有効ブール値を求めることである。これは2.4.3 有効ブール値に定義されている通りである。
条件式の値は以下のように定義される:
テスト式の有効ブール値がtrueであれば、then式の値が返される。テスト式の有効ブール値がfalseであれば、else式の値が返される。
条件式には、動的エラーの伝搬に関する特別なルールがある。テスト式の有効値がtrueであれば、条件式は、else式から起こる動的エラーをすべて無視する
(発生させない)。この場合、else式は観測可能な作用を持たなくてもよいため、評価される必要はない。同様に、テスト式の有効値がfalseであれば、条件式は、then式から起こる動的エラーをすべて無視し、then式は評価される必要はない。
以下に、条件式の例をいくつか示す。
この例では、テスト式は比較式である。
if ($widget1/unit-cost < $widget2/unit-cost) then $widget1 else $widget2
この例では、テスト式はdiscountedという属性の有無を調べている。その属性の値には依存しない。
if ($part/@discounted) then $part/wholesale else $part/retail
限量式は存在限量子と全称限量子を支援する。限量式の値は常にtrueかfalseである。
| [6] | QuantifiedExpr |
::= | ("some" | "every") "$" VarName "in" ExprSingle ("," "$" VarName "in" ExprSingle)* "satisfies" ExprSingle |
限量式は限量子で始まる。これはキーワードsomeかeveryである。これに1つ以上のin節が続き、変数を束縛するのに用いられる。さらにキーワードsatisfiesとテスト式が続く。各in節は、項目の列を返す式に変数を関連づける。この列のことを、その変数に対する束縛列という。in節は変数束縛の組を生成する。これには、それぞれの変数に対する束縛列中の項目の組み合わせ各々に対応する組が含まれる。概念的には、テスト式は、変数束縛の組それぞれについて評価される。結果はテスト式の有効ブール値に依存する。これは2.4.3
有効ブール値で定義されている通りである。限量式の値は以下のルールによって定義される。
限量子がsomeであれば、限量式は、テスト式の評価のうち少なくとも1つが有効ブール値
trueを持つときtrueである。そうでない場合、限量式はfalseである。このルールから、in節が束縛された組を1つも生成しない場合は、限量式の値はfalseであることが分かる。
限量子がeveryであれば、限量式は、テスト式の評価がすべて有効ブール値
trueを持つときtrueである。そうでない場合、限量式はfalseである。このルールから、in節が束縛された組を1つも生成しない場合は、限量式の値はtrueであることが分かる。
限量式中で束縛された変数の有効範囲は、その限量式の部分式のうちその変数束縛の後ろで出現したものすべてから構成される。有効範囲にはその変数が束縛される式は含まれない。
テスト式がさまざまな変数束縛組に対して評価される順序は実装依存である。限量子がsomeであれば、実装は、テスト式がtrueという有効ブール値を持つ束縛組を1つ見つけたら直ちにtrueを返してもよい。また、テスト式がエラーを発生するような束縛組を1つ見つけたら直ちに、動的エラーを発生してもよい。同様に、限量式がeveryであれば、実装は、テスト式がfalseという有効ブール値を持つ束縛組を1つ見つけたら直ちにfalseを返してよい。またテスト式がエラーを発生するような束縛組を1つ見つけたら直ちに、動的エラーを発生してもよい。これらのルールの結果として、以下の例で示すように、限量式の値は、エラーが存在する場合には決定的ではない。
以下に、限量式の例をいくつか示す。
この式は、すべてのpart要素がdiscounted属性を持つならば
(これらの属性の値に関わらず)、trueである。
every $part in /parts/part satisfies $part/@discounted
この式は、少なくとも1つのemployee要素が与えられた比較式を満たすならばtrueである。
some $emp in /emps/employee satisfies
($emp/bonus > 0.25 * $emp/salary)
以下の例では、各限量式がテスト式を9つの変数束縛の組上で評価する。9つの変数束縛とは、列(1, 2,
3)と(2, 3,
4)の直積から構成される。someで始まる式を評価するとtrueであり、everyで始まる式を評価するとfalseである。
some $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4
every $x in (1, 2, 3), $y in (2, 3, 4)
satisfies $x + $y = 4
この限量式はtrueを返すか、型エラーを発生する。というのは、テスト式が、ある1つの変数束縛に対してtrueを返し、別の変数束縛に対して型エラーを発生するからである。
some $x in (1, 2, "cat") satisfies $x * 2 = 4
この限量式はfalseを返すか型エラーを発生する。というのは、テスト式が、ある1つの変数束縛に対してfalseを返し、別の変数束縛に対して型エラーを発生するからである。
every $x in (1, 2, "cat") satisfies $x * 2 = 4
列型はinstance of式,
cast式, castable式,
treat式で使われている。
| [16] | InstanceofExpr |
::= | TreatExpr ( "instance"
"of" SequenceType
)? |
ブール演算子instance ofは、第1演算数の値が第2演算数のSequenceTypeに照合されるとき、trueを返す。これはSequenceTypeの照合にあるルールに従う。そうでない場合はfalseを返す。例えば:
5 instance of xs:integer
この例はtrueを返す。なぜなら与えられた値が与えられた型のインスタンスであるからである。
5 instance of xs:decimal
この例はtrueを返す。なぜなら与えられた値が整数リテラルで、xs:integerが制限によってxs:decimalから導出されるからである。
(5, 6) instance of xs:integer+
この例はtrueを返す。なぜなら与えられた列は2つの整数を含んでおり、指定された型の正しいインスタンスであるからである。
. instance of element()
文脈項目が要素節点のとき、この例はtrueを返す。文脈項目が定義されているが要素節点ではないとき、この例はfalseを返す。文脈項目が未定義であれば、動的エラーが発生する [err:XPDY0002]。
| [19] | CastExpr |
::= | UnaryExpr ( "cast"
"as" SingleType )? |
| [49] | SingleType |
::= | AtomicType
"?"? |
場合によっては、値を指定されたデータ型に変換する必要が生じる。この目的のため、XPathはcast式を用意している。これは、すでにある値に基づき、指定された型の値を新たに生成する。cast式は2つの演算数を取る。入力式と目的型である。入力式の型を入力型という。目的型は原子型で、有効範囲内スキーマ型に含まれており、xs:NOTATIONやxs:anyAtomicTypeであってはならない。また原子型の後ろに出現標識
"?" を置き、空列を許すということを示してもよい [err:XPST0080]。目的型が名前空間接頭辞を持たないならば、その目的型はデフォルト要素/型名前空間に属するとみなされる。cast式の意味は以下の通りである。
原子化が入力式に対して行われる。
原子化の結果が長さ1より大きい原子値の列であれば、型エラーが発生する [err:XPTY0004]。
原子化の結果が空列であれば:
目的型の後ろに?が指定してあれば、cast式の結果は空列である。
目的型の後ろに?が指定してなければ、型エラーが発生する [err:XPTY0004]。
原子化の結果が単一の原子値であれば、cast式の結果は入力型と目的型に依存する。一般的に、cast式は、入力値に基づき目的型の値を新たに生成しようと試みる。ある種の入力型と目的型の組み合わせだけが支援されている。このルールの概要を以下に列挙する。これらのルールの規範的定義は[XQuery 1.0 and XPath 2.0 Functions and Operators]にある。これらのルールの目的のため、実装は、有効範囲内スキーマ定義を検査したり、あるいはその代替としてデータ辞書のような実装依存の機構を用いて、ある型が別の型から制限によって導出されると決定してもよい。
castは、17.1
Casting from primitive types to primitive typesFOに列挙されている入力型と目的型の組み合わせに対して支援される。これらの組み合わせそれぞれについて、入力型と目的型は基本スキーマ型である。例えば、xs:string型の値はスキーマ型xs:decimalに型変換することができる。これらの組み込みの組み合わせについては、型変換の意味が[XQuery
1.0 and XPath 2.0 Functions and Operators]で指定されている。
cast式の目的型がxs:QNameであるか、xs:QNameまたはxs:NOTATIONから導出される型であるか、入力の基礎型が目的型の基礎型と等しくないならば、入力式は文字列リテラルでなければならない
[err:XPTY0004]。
Note:
このルールの理由は、これらの目的型の1つのインスタンスを文字列から構成するには名前空間の束縛に関する知識が必要になる、ということである。入力式がリテラルでない文字列であれば、名前空間の束縛が静的既知名前空間と異なる入力文書から導出されるかもしれない。
castは、入力型が基本でない原子型で、目的型から制限によって導出される場合に支援される。この場合、入力値は目的型の値空間に写像され、その型以外には変更されない。例えば、shoesizeが制限によってxs:integerから導出されるならば、型shoesizeの値はスキーマ型xs:integerに型変換することができる。
castは、目的型が基本でない原子型で、入力型がxs:stringまたはxs:untypedAtomicである場合に支援される。入力値はまず、目的型に対する空白の正規化ルールを適用する([XML
Schema]で定義されているように)ことで、目的型の字句空間中の値に変換される。結果の字句値が目的型のパターンの相
(facet) を満たさないならば、動的エラー [err:FORG0001]
が発生する。次に字句値は、目的型のスキーマ定義ルールを用いて、目的型の値空間に変換される。結果の値が目的型のすべての相を満たさないならば、動的エラー [err:FORG0001] が発生する。
castは、目的型が基本型でない原子型であり、かつ入力型から制限によって導出されるならば、支援される。入力値は目的型のすべての相を満たさなければならない
(パターンの相の場合には、これは、xs:stringへの型変換ルールを用いて、入力値の文字列表現を生成することで検査される)。結果の値は入力値と等しい。ただし動的型は異なる。
基本型 P1 が基本型 P2 に型変換されるならば、制限によって P1 から導出される任意の型は、制限によって P2 から導出される任意の型に型変換できる。そして、目的型の相が満たされると規定される。まず、上のルール (b) を用いて、入力値が P1 に型変換される。次に、上のルール (a) を用いて、P1 型の値が P2 型に変換される。最後に、上のルール (d) を用いて、P2 型の値が目的型に変換される。
上に列挙されていない入力型と目的型の組み合わせに対して、cast式は型エラー [err:XPTY0004]を発生する。
入力型から目的型への型変換が支援されているが、にもかかわらず入力値を目的型の値空間に型変換することが不可能であれば、動的エラーが発生する。
[err:FORG0001] これは、目的型のどの相も満たされない場合を含む。例えば、式"2003-02-31" cast
as xs:dateは動的エラーを発生する。
| [18] | CastableExpr |
::= | CastExpr ( "castable"
"as" SingleType )? |
| [49] | SingleType |
::= | AtomicType
"?"? |
XPathは、与えられた値が与えられた目的型に型変換可能かテストする式を用意している。目的型は原子型で、有効範囲内スキーマ型に含まれていなければならず、xs:NOTATIONやxs:anyAtomicTypeであってはならない。また、空列を許すことを示すために出現標識
"?" を後ろに付けることができる [err:XPST0080]。式V castable as
Tがtrueを返すのは、cast式を用いて値Vが目的型Tに型変換することに成功する場合である。そうでない場合はfalseを返す。castable式を述語として用い、評価時のエラーを避けることも可能である。また、適切な型を選択して与えられた値を処理することにも利用できる。以下に例を示す。
if ($x castable as hatsize) then $x cast as hatsize else if ($x castable as IQ) then $x cast as IQ else $x cast as xs:string
有効範囲内スキーマ型中の原子型それぞれについて
(xs:NOTATIONおよびxs:anyAtomicTypeを除く。これらはインスタンスを生成できない)、構成子関数が暗黙的に定義される。それぞれの場合について、構成子関数の名前は目的型の名前
(名前空間を含む)と同じである。型Tの構成子関数のシグネチャは以下の通りである。
T($arg as xs:anyAtomicType?) as T?
[Definition:
与えられた型に対する構成子関数は、他の原子型のインスタンスを与えられた型に変換するのに用いられる。構成子関数
T($arg)の意味は式($arg cast as
T?)と同じであると定義される。]
xs:QName、あるいはxs:QNameやxs:NOTATIONから導出される型に対する構成子関数では、文字列リテラルの引数か、目的型の基礎型と同じ基礎型を持つ引数を要求する。そうでない場合は型エラー
[err:XPST0004]
が発生する。このルールは、3.10.2
Castに定義されているこれらの型に対するcast式の意味と一貫している。
構成子関数の使い方を以下の例で示す。
この例は("2000-01-01" cast as xs:date?)に等しい。
xs:date("2000-01-01")
この例は(($floatvalue * 0.2E-5) cast as
xs:decimal?)に等しい。
xs:decimal($floatvalue * 0.2E-5)
この例は、21日に等しいxs:dayTimeDurationの値を返す。これは("P21D"
cast as xs:dayTimeDuration?)と同値である。
xs:dayTimeDuration("P21D")
usa:zipcodeがユーザ定義の原子型であり有効範囲内スキーマ型中にあるならば、以下の式は、式("12345" cast as
usa:zipcode?)と同値である。
usa:zipcode("12345")
Note:
名前空間中にない原子型のインスタンスは、以下のいずれかの方法で構成することができる。
もしデフォルト要素/型名前空間が "none"
であれば、cast式を用いる。
17 cast as apple
もしデフォルト関数名前空間が "none" であれば、構成子関数を用いる。
apple(17)
| [17] | TreatExpr |
::= | CastableExpr (
"treat" "as" SequenceType
)? |
XPathはtreatと呼ばれる式を用意している。これは、演算数の静的型を変更するのに用いることができる。
castのように、treat式は2つの演算数をとる。式とSequenceTypeである。しかし、castとは異なり、treatはその演算数の動的型や値は変更しない。そのかわり、treatの目的は、式が評価時に期待される動的型を持つことを保証することである。
expr1 treat as
type1の意味は以下の通りである。
静的解析時:
treat式の静的型はtype1である。これにより、type1の引数を必要とする関数の引数として、その式を用いることが可能となる。
式の評価時:
SequenceTypeの照合のルールを用いてexpr1がtype1と照合されるならば、treat式はexpr1の値を返す。そうでない場合は動的エラー [err:XPDY0050]が発生する。expr1の値が返るならば、その識別性は保存される。treat式は、その式の演算数の値が実行時に期待される型にしたがうことを保証する。
例:
$myaddress treat as element(*, USAddress)
$myaddressの静的型はelement(*,
Address)であってもよい。これはelement(*,
USAddress)より詳しくない型である。しかし実行時には、$myaddressの値は、SequenceTypeの照合のルールを用いて、型element(*,
USAddress)に照合されなければならない。そうでない場合は動的エラーが発生する [err:XPDY0050]。
XPathの文法は、単純な拡張バッカス記法 (EBNF) を用いる。これは[XML 1.0]と同じものであるが、以下に述べるように、若干の違いがある。
名前づけられた記号はすべて、大文字で始まる名前を持つ。
外部の仕様の生成規則を参照するための記法を加える。
コメントや、文法の生成規則に関する特別な文法的制限を '/*' と '*/' という記号の間に置く。
'xgc:' 接頭辞は特別な文法的制限であり、その詳細はA.1.2 特別な文法上の制約に説明がある。
'ws:' 接頭辞は生成規則に対する空白のルールであり、その詳細はA.2.4 空白規則に説明がある。
'gn:' 接頭辞は '文法上の備考' (Grammar Note)の意味であり、ルール解釈を明確にすることを意味する。これについてはA.1.3 文法に関する備考に説明されている。これらの備考は参考である。
この文法の終端記号には、既出の生成規則で用いられた引用符付き文字列や、A.2.1 終端記号で定義された終端記号が含まれる。
EBNF記法についてのより詳しい説明はA.1.1 記法にある。
可読性を上げるため、この文書の本体のEBNFでは記法上の特徴をいくつか省略している。この附録はEBNFの参考バージョンである。
| [1] | XPath |
::= | Expr |
|
| [2] | Expr |
::= | ExprSingle (","
ExprSingle)* |
|
| [3] | ExprSingle |
::= | ForExpr |
|
| [4] | ForExpr |
::= | SimpleForClause
"return" ExprSingle |
|
| [5] | SimpleForClause |
::= | "for" "$" VarName "in"
ExprSingle ("," "$" VarName "in" ExprSingle)* |
|
| [6] | QuantifiedExpr |
::= | ("some" | "every") "$" VarName "in" ExprSingle ("," "$" VarName "in" ExprSingle)* "satisfies" ExprSingle |
|
| [7] | IfExpr |
::= | "if" "(" Expr ")" "then"
ExprSingle "else" ExprSingle |
|
| [8] | OrExpr |
::= | AndExpr ( "or" AndExpr )* |
|
| [9] | AndExpr |
::= | ComparisonExpr (
"and" ComparisonExpr
)* |
|
| [10] | ComparisonExpr |
::= | RangeExpr ( (ValueComp |
|
| [11] | RangeExpr |
::= | AdditiveExpr (
"to" AdditiveExpr
)? |
|
| [12] | AdditiveExpr |
::= | MultiplicativeExpr ( ("+" |
"-") MultiplicativeExpr
)* |
|
| [13] | MultiplicativeExpr |
::= | UnionExpr ( ("*" |
"div" | "idiv" | "mod") UnionExpr )* |
|
| [14] | UnionExpr |
::= | IntersectExceptExpr (
("union" | "|") IntersectExceptExpr
)* |
|
| [15] | IntersectExceptExpr |
::= | InstanceofExpr (
("intersect" | "except") InstanceofExpr )* |
|
| [16] | InstanceofExpr |
::= | TreatExpr (
"instance" "of" SequenceType
)? |
|
| [17] | TreatExpr |
::= | CastableExpr (
"treat" "as" SequenceType
)? |
|
| [18] | CastableExpr |
::= | CastExpr ( "castable"
"as" SingleType )? |
|
| [19] | CastExpr |
::= | UnaryExpr ( "cast"
"as" SingleType )? |
|
| [20] | UnaryExpr |
::= | ("-" | "+")* ValueExpr |
|
| [21] | ValueExpr |
::= | PathExpr |
|
| [22] | GeneralComp |
::= | "=" | "!=" | "<" | "<=" | ">" |
">=" |
|
| [23] | ValueComp |
::= | "eq" | "ne" | "lt" | "le" | "gt" | "ge" |
|
| [24] | NodeComp |
::= | "is" | "<<" | ">>" |
|
| [25] | PathExpr |
::= | ("/" RelativePathExpr?) |
/* xgs: leading-lone-slash */ |
| [26] | RelativePathExpr |
::= | StepExpr (("/" | "//")
StepExpr)* |
|
| [27] | StepExpr |
::= | FilterExpr |
AxisStep |
|
| [28] | AxisStep |
::= | (ReverseStep |
ForwardStep) PredicateList |
|
| [29] | ForwardStep |
::= | (ForwardAxis
NodeTest) | AbbrevForwardStep |
|
| [30] | ForwardAxis |
::= | ("child" "::") |
|
| [31] | AbbrevForwardStep |
::= | "@"? NodeTest |
|
| [32] | ReverseStep |
::= | (ReverseAxis
NodeTest) | AbbrevReverseStep |
|
| [33] | ReverseAxis |
::= | ("parent" "::") |
|
| [34] | AbbrevReverseStep |
::= | ".." |
|
| [35] | NodeTest |
::= | KindTest | NameTest |
|
| [36] | NameTest |
::= | QName | Wildcard |
|
| [37] | Wildcard |
::= | "*" |
/* ws: explicit */ |
| [38] | FilterExpr |
::= | PrimaryExpr
PredicateList |
|
| [39] | PredicateList |
::= | Predicate* |
|
| [40] | Predicate |
::= | "[" Expr "]" |
|
| [41] | PrimaryExpr |
::= | Literal | VarRef | ParenthesizedExpr | ContextItemExpr | FunctionCall |
|
| [42] | Literal |
::= | NumericLiteral |
StringLiteral |
|
| [43] | NumericLiteral |
::= | IntegerLiteral |
DecimalLiteral | DoubleLiteral |
|
| [44] | VarRef |
::= | "$" VarName |
|
| [45] | VarName |
::= | QName |
|
| [46] | ParenthesizedExpr |
::= | "(" Expr? ")" |
|
| [47] | ContextItemExpr |
::= | "." |
|
| [48] | FunctionCall |
::= | QName "(" (ExprSingle ("," ExprSingle)*)? ")" |
/* xgs: reserved-function-names */ |
| /* gn: parens */ | ||||
| [49] | SingleType |
::= | AtomicType
"?"? |
|
| [50] | SequenceType |
::= | ("empty-sequence" "(" ")") |
|
| [51] | OccurrenceIndicator |
::= | "?" | "*" | "+" |
/* xgs: occurrence-indicators */ |
| [52] | ItemType |
::= | KindTest | ("item" "("
")") | AtomicType |
|
| [53] | AtomicType |
::= | QName |
|
| [54] | KindTest |
::= | DocumentTest |
|
| [55] | AnyKindTest |
::= | "node" "(" ")" |
|
| [56] | DocumentTest |
::= | "document-node" "(" (ElementTest | SchemaElementTest)?
")" |
|
| [57] | TextTest |
::= | "text" "(" ")" |
|
| [58] | CommentTest |
::= | "comment" "(" ")" |
|
| [59] | PITest |
::= | "processing-instruction" "(" (NCName | StringLiteral)? ")" |
|
| [60] | AttributeTest |
::= | "attribute" "(" (AttribNameOrWildcard (","
TypeName)?)? ")" |
|
| [61] | AttribNameOrWildcard |
::= | AttributeName |
"*" |
|
| [62] | SchemaAttributeTest |
::= | "schema-attribute" "(" AttributeDeclaration
")" |
|
| [63] | AttributeDeclaration |
::= | AttributeName |
|
| [64] | ElementTest |
::= | "element" "(" (ElementNameOrWildcard (","
TypeName "?"?)?)?
")" |
|
| [65] | ElementNameOrWildcard |
::= | ElementName |
"*" |
|
| [66] | SchemaElementTest |
::= | "schema-element" "(" ElementDeclaration
")" |
|
| [67] | ElementDeclaration |
::= | ElementName |
|
| [68] | AttributeName |
::= | QName |
|
| [69] | ElementName |
::= | QName |
|
| [70] | TypeName |
::= | QName |
以下の定義は、この解説を正確に定義するのに役立つ。
[Definition: 文法中の各規則は1つの記号を定義する。ここで用いられる形式は以下の通りである。
symbol ::= expression
[Definition: 終端記号は記号、文字列、規則の右辺に出現可能だが主文法の左辺には決して出現しないパターンである。ただし、終端記号のための文法の左辺には出現してよい。] 以下の構成要素が、長さ1以上の文字からなる文字列で終端記号中にあるものと照合されて用いられる。
任意のCharで、示された範囲(すべての)中の値であるようなものと照合される。
任意のCharで、列挙された文字のどれかの値であるようなものと照合される。列挙と範囲を1つの角括弧の中で混ぜることもできる。
任意のCharで、与えられた文字のどれでもない値と照合される。禁止される値の列挙と範囲を1つの角括弧のなかで混ぜることもできる。
二重引用符の中に出現する文字の列と照合される。
一重引用符の中に出現する文字の列と照合される。
用意された参照の通りの外部仕様で定義される生成規則によって照合される文字列と照合される。
パターン (上記の構成要素を含む) を文法構成子で組み合わせ、より複雑なパターンを形成することができる。このようなパターンは文字列の複雑な集合に照合される。以下の例では、AとBは(部分)パターンを表す。
Aは1つの単位として扱われ、このリスト中に記述されているように組み合わせても構わない。
Aに照合されるか、何とも照合されない。すなわち省略可能なAと照合される。
Aの後ろにBが続くものと照合される。この演算子は代替よりも優先度が高い。従ってA
B | C Dは(A B) | (C D)と同じである。
AまたはBに照合される。ただし両方同時には照合されない。
Aに照合されるが、Bには照合されないすべての文字列に照合される。
Aの1回以上の出現に照合される。連接は代替よりも優先度が高い。従って、A+ |
B+は(A+) | (B+)と同じである。
Aの0回以上の出現に照合される。連接は代替よりも優先度が高い。従って、A* |
B*は(A*) | (B*)と同じである。
この節はEBNFの生成規則の制約を含む。これらは正当な文を解釈するのに必要となる。以下の備考は、次のような記法で、生成規則の右辺から参照される: /* xgc: <id> */。
Constraint: leading-lone-slash
単一のスラッシュは、完全経路式として出現するか、RelativePathExprの後に続く経路式の最初の部分として出現するかのいずれかである。後者の場合、NameTest ("*" または QName)の形式を取る。"*", "union" などの演算子が出現しうる文脈では、構文解析器は演算子とNameTestを区別するのが困難であってもよい。例えば、先読みをしなければ、式 "/ * 5" の最初の部分は例えば容易に "/ *" という完全経路式だととられる。これは全く異なる解釈を持つ ("/"の子節点)。
そこで、先読みの必要を削減するため、スラッシュの直後に続くトークンが "*" またはキーワードである場合は、スラッシュはPathExprの先頭でなければならないが、その全体であってはならない (そして、それに続くトークンはNameTestでなければならず、演算子であってはならない)。
単一のスラッシュは、括弧で囲むことにより、演算子の左側の引数として用いてもよい: (/) *
5。一方、式5 * /は括弧なしでも正しい式である。
実装が[XML 1.0]と[XML
Names]の字句定義、あるいは[XML 1.1]と[XML Names
1.1]の字句定義のいずれを支援することを選択するかによって、この生成規則の定義を得る外部文書が決定される。EBNFではバージョン1.0への参照しか持たせていない。ある場合には、XML
1.0とXML
1.1の定義は全く同じであるかもしれない。また、これらの外部定義は、その仕様の空白のルールに従い、この仕様のルール、特にA.2.4.1
デフォルト空白処理には従わないことに注意すること。したがってprefix :
localnameは、XML文書中では許されないのと同様に、この仕様では正しくないQNameである。またコメントはコロンのどちら側にも許されない。また整形式制約のような特別な文法的制約を考慮しなければならない。
Constraint: reserved-function-names
言語のキーワードと同じように綴られた接頭辞なしの関数名は、言語の認識を困難にするかもしれない。例えばif(foo)は、FunctionCallとも、IfExprの先頭ともとれる。そのため、A.3
予約済関数名中の名前のいずれかと一致する接頭辞なし名前の関数を呼び出すことは、文法的に誤りである。
"if"という名前の関数は、その名前空間をある接頭辞に束縛し、接頭辞付きの形式を用いれば、呼び出すことができる: "if(foo)" の代わりに "library:if(foo)" というようにである。
Constraint: occurrence-indicators
すでに書いたように、A XPathの文法の文法は '+' と '*'
の Kleene
演算子を用いたある種の形式について、曖昧である。この曖昧性は以下のようにして解消される。これらの演算子はSequenceType式と強く結合しており、これらの記号を他の用途で用いた場合より高い優先度を持つ。列型に続いて
'?' ばかりでなく '+' や '*' が出現しても、出現標識であると仮定される。すなわち、ItemTypeの直後に出現する "+", "*", "?" はOccurrenceIndicatorでなければならない。したがって、4
treat as item() + - 5は(4 treat as item()+) -
5と解釈されなければならない。つまり '+' は OccurrenceIndicator として、'-'
は減算演算子として解釈されなければならない。"+" を強制的に加算演算子と解釈するには (その結果として "-"
は単項のマイナスと解釈される)、括弧を用いてもよい: (4 treat as item()) +
-5という形で、SequenceType式を括弧で囲むと、期待される解釈を導く。
このルールの結果として、このルールを用いなければ正しくかつ曖昧性のないある種の形式は、認識されない。"4 treat as item() + 5" では、"+" はOccurrenceIndicatorととられ、演算子とは見なされない。そのため、この式は正しい式ではないと解釈される。
この節は、EBNFの生成規則についての一般的な備考を含む。これらはEBNFをどのように解釈し、またどのように実装するかを理解する助けとなるかもしれない。これらの備考は規範的である。以下の備考は、/* gn: <id> */という形式で、生成規則の右辺から参照される。
Note:
FunctionCallを、Commentの続くQNameやキーワードと区別するには、先読みが必要である。例えば:
address (: this may be empty
:)は、先読みを用いないと、"address"という名前の関数の呼び出しと間違われるかもしれない。
別の例はfor (: whom the bell :) $tolls in 3 return
$tollsである。これはキーワード "for" を関数名と間違ってはならない。
コメントは無視可能な空白が許される場所にならどこでも許される。Comment記号は生成規則の右辺に明示的に出現はしない (それ自身の生成規則を除く)。A.2.4.1 デフォルト空白処理を見よ。
コメントはコメントを入れ子で含むことができる。ただし、すべての "(:" と ":)" パターンの対応が取れている限りにおいてである。さらに外側のコメントの中で発生するかには関係しない。
Note:
字句解析では概して、入れ子のコメントを扱うのに各 "(:" パターンでカウンタを1増やし、各 ":)" パターンでカウンタを1減らすという方法を用いるかもしれない。そのコメントは、カウンタが0に戻るまでずっと終了しない。
いくつか例で説明する。
(: commenting out a (: comment :) may be confusing, but
often helpful
:)は正しいコメントである。なぜなら対応の取れたコメントの入れ子は許されるからである。
"this is just a string :)"は正しい式である。しかし、(:
"this is just a string :)" :)は構文エラーを引き起こす。同様に"this is
another string (:"は正しい式だが、(: "this is another string
(:"
:)は構文エラーを引き起こす。入れ子のコメントの限界として、リテラル内容により対応の取れない入れ子コメントが生じる。
for (: set up loop :) $i in $x return
$iは、コメントを無視すると、構文的には正しい。
5 instance (: strange place for a comment :) of
xs:integerもまた構文的に正しい。
上の文法で仮定されている終端記号を、この節で述べる。
生成規則中に出現する引用符つき文字列は終端記号である。
その他の終端記号はA.2.1 終端記号で定義されている。
ホスト言語は、[XML 1.0]や[XML Names]の字句規則に従うか、あるいは[XML 1.1]や[XML Names 1.1]の字句規則に従うか、選択してよい。
トークンを切り出すときには、現在の文脈で正しい照合のうち、最長のものが使われる。
すべてのキーワードは大文字小文字を区別する。キーワードは予約されない。すなわち、任意のQNameはキーワードと重複してよい。ただし、A.3 予約済関数名に述べるものを除く。
| [71] | IntegerLiteral |
::= | Digits |
|
| [72] | DecimalLiteral |
::= | ("." Digits) | (Digits "." [0-9]*) |
/* ws: explicit */ |
| [73] | DoubleLiteral |
::= | (("." Digits) |
(Digits ("." [0-9]*)?)) [eE] [+-]?
Digits |
/* ws: explicit */ |
| [74] | StringLiteral |
::= | ('"' (EscapeQuot |
[^"])* '"') | ("'" (EscapeApos
| [^'])* "'") |
/* ws: explicit */ |
| [75] | EscapeQuot |
::= | '""' |
|
| [76] | EscapeApos |
::= | "''" |
|
| [77] | Comment |
::= | "(:" (CommentContents | Comment)* ":)" |
/* ws: explicit */ |
| /* gn: comments */ | ||||
| [78] | QName |
::= | [http://www.w3.org/TR/REC-xml-names/#NT-QName] |
/* xgs: xml-version */ |
| [79] | NCName |
::= | [http://www.w3.org/TR/REC-xml-names/#NT-NCName] |
/* xgs: xml-version */ |
| [80] | Char |
::= | [http://www.w3.org/TR/REC-xml#NT-Char] |
/* xgs: xml-version */ |
以下の記号は、終端記号の定義中でのみ用いられる。これらはA.1 EBNFの文法の終端記号ではない。
| [81] | Digits |
::= | [0-9]+ |
| [82] | CommentContents |
::= | (Char+ - (Char* ('(:' |
':)') Char*)) |
終端記号には2種類ある。区切り終端記号と非区切り終端記号である。
[Definition: 区切り終端記号は: ",", "$", "(", ")", "=", "!=", "<=", ">", ">=", "<<", ">>", "::", "@", "..", "*", "[", "]", ".", "?", "-", "+", "<", Comment, "/", "//", ":"]
[Definition: 非区切り終端記号は: "return", "for", "in", "some", "every", "satisfies", "if", "then", "else", "eq", "ne", "lt", "le", "gt", "ge", "is", "child", "descendant", "attribute", "self", "descendant-or-self", "following-sibling", "following", "namespace", "parent", "ancestor", "preceding-sibling", "preceding", "ancestor-or-self", "empty-sequence", "item", "node", "document-node", "text", "comment", "processing-instruction", "schema-attribute", "element", "schema-element", IntegerLiteral, DecimalLiteral, DoubleLiteral, StringLiteral, "external", EscapeQuot, EscapeApos, QName, NCName, Char, Digits]
[Definition: 記号区切りとしての空白やComments関数。多くの場合、これらは文法中では述べられておらず、文法中に述べられている2つの終端記号の間に出現してもよい。ただし/* ws: explicit */という備考や、/* xgs: xml-version */という備考で禁止されている場所を除く。]
通例として、連続した終端記号は空白やCommentsで区切る。しかし、このことが要求されるのは、そうしなければ2つの非区切り終端記号が互いに隣接してしまう場合のみである。この例外が2つある。"." と "-" がQNameやNCNameに続くならば、その間に記号区切りが必要である。
XPath処理器は、入力中にあるすべての行末を、構文解析前に正規化するように振る舞わなければならない。正規化は、[XML 1.0]か[XML 1.1]かいずれの字句処理を支援すると選択するかに従って行われるべきである。
[XML 1.0]の処理では、以下のすべてが単一の文字 #xA に変換されなければならない。
2文字の列 #xD #xA
#xA の直後に続かない #xD 文字
[XML 1.1]の処理では、以下のすべてが単一の文字 #xA に変換されなければならない。
2文字の列 #xD #xA
2文字の列 #xD #x85
単一の文字 #x85
単一の文字 #x2028
#xA または #x85 の直後に続かない #xD 文字
[Definition: 空白文字は、[http://www.w3.org/TR/REC-xml#NT-S]で定義される任意の文字である。]
[Definition: 無視可能な空白は、空白文字のうち終端記号の間に出現してもよいものである。ただし、これらの文字がws:explicitという備考で目印づけされた生成規則の文脈に出現する場合を除く。この場合、これらの文字は明示的に指定された場所にしか出現できない (A.2.4.2 明示的空白処理を見よ)。] 無視可能な空白文字は、式の意味には影響しない。空白は、モジュールの最初の終端記号の前や、最後の終端記号の後ろにも許される。空白は、任意の2つの終端記号の間に許される。Commentsもまた "空白" として振舞い、2つの隣接した終端記号を1つだと認識されることを防いでもよい。いくつか例で説明する。
foo- fooは構文エラーになる。"foo-" が QName として認識される。
foo -fooは構文的にはfoo -
foo、すなわち減算演算子によって区切られた2つのQNameと同値である。
foo(: This is a comment :)- fooは構文的にはfoo -
fooと等価である。これは、コメントによって、2つの隣接した終端記号が1つのものとして認識されるのが防がれているからである。
foo-fooは構文的には1つのQNameと等価である。これは、"-"
がQName中の正しい文字だからである。名前の文字の後ろで演算子として使うときには、"-"
は、例えば空白や括弧によって、名前から区切らなければならない。
10div 3は構文エラーになる。
10 div3もまた構文エラーになる。
10div3もまた構文エラーになる。
EBNFの生成規則では、空白処理がデフォルトルールと異なる場合、以下に示す記述で明示的空白処理を指定する。この記述は継承されない。言い換えると、EBNFルールが /* ws: explicit */ と目印付けされているならば、この記述は、そのルールの '子' の EBNF 生成規則いずれにも自動的には適用されない。
/* ws: explicit */ は、EBNF記述で、Sもしくは他の方法により、空白文字の許される場所が明示的に記述されていることを意味している。備考 /* ws:
explicit */ を持つ生成規則では、A.2.4.1
デフォルト空白処理は適用されない。Commentsもまたこれらの生成規則中では許されない。
以下の名前は、接頭辞のない形式の関数名としては許されない。なぜなら、式の構文のほうが優先するからである。
attribute
comment
document-node
element
empty-sequence
if
item
node
processing-instruction
schema-attribute
schema-element
text
typeswitch
Note:
キーワードtypeswitchは XPath
では用いられないが、XQueryとの互換性のため予約済関数とみなされる。
A.1 EBNF中の文法では、XPathの演算子の間の組み込み優先順位を規定として定義している。これらの演算子をここでまとめ、優先度を低い順から高い順に明らかにする。より低い優先度順位を持つ演算子を、より高い優先度順位を持つ演算子が含むことはできない。結合性の欄は、式中で同じ優先度を持つ演算子が適用される順番を表している。
| # | 演算子 | 結合性 |
|---|---|---|
| 1 | , (comma) | 左から右 |
| 3 | for, some, every, if | 左から右 |
| 4 | or | 左から右 |
| 5 | and | 左から右 |
| 6 | eq, ne, lt, le, gt, ge, =, !=, <, <=, >, >=, is, <<, >> | 左から右 |
| 7 | to | 左から右 |
| 8 | +, - | 左から右 |
| 9 | *, div, idiv, mod | 左から右 |
| 10 | union, | | 左から右 |
| 11 | intersect, except | 左から右 |
| 12 | instance of | 左から右 |
| 13 | treat | 左から右 |
| 14 | castable | 左から右 |
| 15 | cast | 左から右 |
| 16 | -(unary), +(unary) | 右から左 |
| 17 | ?, *(OccurrenceIndicator), +(OccurrenceIndicator) | 左から右 |
| 18 | /, // | 左から右 |
| 19 | [ ], ( ), {} | 左から右 |
[Definition: ある条件の下で、原子値をある型から別の型に昇格させることができる。数や文字列を演算数として許す関数呼び出し (3.1.5 関数呼び出しを見よ)や演算子の評価 (B.2 演算子の写像を見よ)のときに、型の昇格が用いられる。] 以下のような型の昇格が許されている。
数型の昇格:
xs:float型
(もしくはxs:float型から制限によって導出される任意の型)
の値はxs:double型に昇格させることができる。結果は、元の値と等しいxs:doubleの値である。
xs:decimal型
(もしくはxs:decimalから制限によって導出される任意の型)
の値は、xs:float型、もしくはxs:double型のいずれかに昇格させることができる。この昇格の結果は、元の値を要求された型に型変換することで生成される。この種の昇格は、正確さを損なうことを引き起こすかもしれない。
URI型の昇格: xs:anyURI型
(もしくはxs:anyURIから制限によって導出される任意の型)
の値は、xs:string型に昇格させることができる。この昇格の結果は、元の値をxs:string型に型変換することで生成される。
この節の演算子の写像表は、さまざまなXPathの演算子に対して定義される方の組み合わせを列挙する。[Definition: 各演算子、および演算数の型の正しい組み合わせに対して、演算子の写像表は、結果の型と演算子関数を指定する。この関数は、与えられた型に対する演算子の意味を実装する。] 演算子関数の定義は[XQuery 1.0 and XPath 2.0 Functions and Operators]で与えられている。演算子の結果、その演算子関数によってエラーが発生してもよい。これに関する定義は[XQuery 1.0 and XPath 2.0 Functions and Operators]にある。ある場合には、演算子関数は与えられた演算子の完全な意味を実装しない。各演算子の定義 (空列や長さが1より大きい列に対する振舞いを含む) については、この文書の主部分中の記述を見よ。
andやor演算子は、この文書の主部分に直接定義されており、演算子の写像表には出現していない。
演算子の写像表中の演算子が型 ET の演算数を要求するとき、型の昇格や部分型置換によって型 AT が型
ET に変換されるならば、その演算子は型 AT の演算数に適用することができる。
例えば、表のエントリにgt演算子を2つのxs:date演算数に適用してよく、そのときxs:booleanを返すと示しているものがある。したがって、gt演算子は2つのxs:dateの部分型
(これらは異なることもある) に適用してもよく、この場合もxs:booleanを返す。
[Definition:
型を参照するとき、数という用語はxs:integer型,
xs:decimal型, xs:float型,
xs:double型を表す。] 演算数と結果が数と指定されている演算子は、4つの演算子、すなわち数型それぞれに対し1つの演算子を表していると考えられる。例えば、数型の+演算子は、以下の4つの演算子を表していると考えられる:
| 演算子 | 第1演算数の型 | 第2演算数の型 | 結果の型 |
+ |
xs:integer |
xs:integer |
xs:integer |
+ |
xs:decimal |
xs:decimal |
xs:decimal |
+ |
xs:float |
xs:float |
xs:float |
+ |
xs:double |
xs:double |
xs:double |
型の昇格や部分型置換によって型 AT
が4つの数型のいずれかに変換可能であれば、
数演算子は型ATの演算数に正しく適用してよい。演算子の結果の型が数と列挙されていれば、その意味は "順序リスト
(xs:integer, xs:decimal, xs:float,
xs:double)のうち、すべての演算数が部分型置換や型の昇格により変換することのできる型の最初のもの"
である。例として、型hatsizeがxs:integerから導出されており、型shoesizeがxs:floatから導出されているとしよう。このとき、+演算子が、型hatsizeとshoesizeの演算数を伴って実行されるならば,
型xs:floatの結果を返す。同様に、+が型hatsizeの2つの演算数を伴って実行されるならば、型xs:integerの結果を返す。
[Definition:
演算子の写像表で、Gregorianという用語は、xs:gYearMonth型,
xs:gYear型, xs:gMonthDay型,
xs:gDay型, xs:gMonth型を表す。]
2つのGregorian型の演算数を取ることのできる2項演算子について、演算数はともに同じ型でなければならない。
(例えば、1つの演算数がxs:gDay型であれば、もう一方の演算数もxs:gDayでなければならない。)
| 演算子 | 型(A) | 型(B) | 関数 | 結果の型 |
|---|---|---|---|---|
| A + B | 数 | 数 | op:numeric-add(A, B) | 数 |
| A + B | xs:date | xs:yearMonthDuration | op:add-yearMonthDuration-to-date(A, B) | xs:date |
| A + B | xs:yearMonthDuration | xs:date | op:add-yearMonthDuration-to-date(B, A) | xs:date |
| A + B | xs:date | xs:dayTimeDuration | op:add-dayTimeDuration-to-date(A, B) | xs:date |
| A + B | xs:dayTimeDuration | xs:date | op:add-dayTimeDuration-to-date(B, A) | xs:date |
| A + B | xs:time | xs:dayTimeDuration | op:add-dayTimeDuration-to-time(A, B) | xs:time |
| A + B | xs:dayTimeDuration | xs:time | op:add-dayTimeDuration-to-time(B, A) | xs:time |
| A + B | xs:dateTime | xs:yearMonthDuration | op:add-yearMonthDuration-to-dateTime(A, B) | xs:dateTime |
| A + B | xs:yearMonthDuration | xs:dateTime | op:add-yearMonthDuration-to-dateTime(B, A) | xs:dateTime |
| A + B | xs:dateTime | xs:dayTimeDuration | op:add-dayTimeDuration-to-dateTime(A, B) | xs:dateTime |
| A + B | xs:dayTimeDuration | xs:dateTime | op:add-dayTimeDuration-to-dateTime(B, A) | xs:dateTime |
| A + B | xs:yearMonthDuration | xs:yearMonthDuration | op:add-yearMonthDurations(A, B) | xs:yearMonthDuration |
| A + B | xs:dayTimeDuration | xs:dayTimeDuration | op:add-dayTimeDurations(A, B) | xs:dayTimeDuration |
| A - B | 数 | 数 | op:numeric-subtract(A, B) | 数 |
| A - B | xs:date | xs:date | op:subtract-dates(A, B) | xs:dayTimeDuration |
| A - B | xs:date | xs:yearMonthDuration | op:subtract-yearMonthDuration-from-date(A, B) | xs:date |
| A - B | xs:date | xs:dayTimeDuration | op:subtract-dayTimeDuration-from-date(A, B) | xs:date |
| A - B | xs:time | xs:time | op:subtract-times(A, B) | xs:dayTimeDuration |
| A - B | xs:time | xs:dayTimeDuration | op:subtract-dayTimeDuration-from-time(A, B) | xs:time |
| A - B | xs:dateTime | xs:dateTime | op:subtract-dateTimes(A, B) | xs:dayTimeDuration |
| A - B | xs:dateTime | xs:yearMonthDuration | op:subtract-yearMonthDuration-from-dateTime(A, B) | xs:dateTime |
| A - B | xs:dateTime | xs:dayTimeDuration | op:subtract-dayTimeDuration-from-dateTime(A, B) | xs:dateTime |
| A - B | xs:yearMonthDuration | xs:yearMonthDuration | op:subtract-yearMonthDurations(A, B) | xs:yearMonthDuration |
| A - B | xs:dayTimeDuration | xs:dayTimeDuration | op:subtract-dayTimeDurations(A, B) | xs:dayTimeDuration |
| A * B | 数 | 数 | op:numeric-multiply(A, B) | 数 |
| A * B | xs:yearMonthDuration | 数 | op:multiply-yearMonthDuration(A, B) | xs:yearMonthDuration |
| A * B | 数 | xs:yearMonthDuration | op:multiply-yearMonthDuration(B, A) | xs:yearMonthDuration |
| A * B | xs:dayTimeDuration | 数 | op:multiply-dayTimeDuration(A, B) | xs:dayTimeDuration |
| A * B | 数 | xs:dayTimeDuration | op:multiply-dayTimeDuration(B, A) | xs:dayTimeDuration |
| A idiv B | 数 | 数 | op:numeric-integer-divide(A, B) | xs:integer |
| A div B | 数 | 数 | op:numeric-divide(A, B) | 数; ただし、演算数がともに xs:integer であれば xs:decimal |
| A div B | xs:yearMonthDuration | 数 | op:divide-yearMonthDuration(A, B) | xs:yearMonthDuration |
| A div B | xs:dayTimeDuration | 数 | op:divide-dayTimeDuration(A, B) | xs:dayTimeDuration |
| A div B | xs:yearMonthDuration | xs:yearMonthDuration | op:divide-yearMonthDuration-by-yearMonthDuration (A, B) | xs:decimal |
| A div B | xs:dayTimeDuration | xs:dayTimeDuration | op:divide-dayTimeDuration-by-dayTimeDuration (A, B) | xs:decimal |
| A mod B | 数 | 数 | op:numeric-mod(A, B) | 数 |
| A eq B | 数 | 数 | op:numeric-equal(A, B) | xs:boolean |
| A eq B | xs:boolean | xs:boolean | op:boolean-equal(A, B) | xs:boolean |
| A eq B | xs:string | xs:string | op:numeric-equal(fn:compare(A, B), 0) | xs:boolean |
| A eq B | xs:date | xs:date | op:date-equal(A, B) | xs:boolean |
| A eq B | xs:time | xs:time | op:time-equal(A, B) | xs:boolean |
| A eq B | xs:dateTime | xs:dateTime | op:datetime-equal(A, B) | xs:boolean |
| A eq B | xs:yearMonthDuration | xs:yearMonthDuration | op:yearMonthDuration-equal(A, B) | xs:boolean |
| A eq B | xs:dayTimeDuration | xs:dayTimeDuration | op:dayTimeDuration-equal(A, B) | xs:boolean |
| A eq B | xs:duration | xs:duration | op:duration-equal(A, B) | xs:boolean |
| A eq B | Gregorian | Gregorian | op:gYear-equal(A, B) etc. | xs:boolean |
| A eq B | xs:hexBinary | xs:hexBinary | op:hex-binary-equal(A, B) | xs:boolean |
| A eq B | xs:base64Binary | xs:base64Binary | op:base64-binary-equal(A, B) | xs:boolean |
| A eq B | xs:anyURI | xs:anyURI | op:numeric-equal(fn:compare(A, B), 0) | xs:boolean |
| A eq B | xs:QName | xs:QName | op:QName-equal(A, B) | xs:boolean |
| A eq B | xs:NOTATION | xs:NOTATION | op:NOTATION-equal(A, B) | xs:boolean |
| A ne B | 数 | 数 | fn:not(op:numeric-equal(A, B)) | xs:boolean |
| A ne B | xs:boolean | xs:boolean | fn:not(op:boolean-equal(A, B)) | xs:boolean |
| A ne B | xs:string | xs:string | fn:not(op:numeric-equal(fn:compare(A, B), 0)) | xs:boolean |
| A ne B | xs:date | xs:date | fn:not(op:date-equal(A, B)) | xs:boolean |
| A ne B | xs:time | xs:time | fn:not(op:time-equal(A, B)) | xs:boolean |
| A ne B | xs:dateTime | xs:dateTime | fn:not(op:datetime-equal(A, B)) | xs:boolean |
| A ne B | xs:yearMonthDuration | xs:yearMonthDuration | fn:not(op:yearMonthDuration-equal(A, B)) | xs:boolean |
| A ne B | xs:dayTimeDuration | xs:dayTimeDuration | fn:not(op:dayTimeDuration-equal(A, B) | xs:boolean |
| A ne B | xs:duration | xs:duration | fn:not(op:duration-equal(A, B)) | xs:boolean |
| A ne B | Gregorian | Gregorian | fn:not(op:gYear-equal(A, B)) etc. | xs:boolean |
| A ne B | xs:hexBinary | xs:hexBinary | fn:not(op:hex-binary-equal(A, B)) | xs:boolean |
| A ne B | xs:base64Binary | xs:base64Binary | fn:not(op:base64-binary-equal(A, B)) | xs:boolean |
| A ne B | xs:anyURI | xs:anyURI | fn:not(op:numeric-equal(fn:compare(A, B), 0)) | xs:boolean |
| A ne B | xs:QName | xs:QName | fn:not(op:QName-equal(A, B)) | xs:boolean |
| A ne B | xs:NOTATION | xs:NOTATION | fn:not(op:NOTATION-equal(A, B)) | xs:boolean |
| A gt B | 数 | 数 | op:numeric-greater-than(A, B) | xs:boolean |
| A gt B | xs:boolean | xs:boolean | op:boolean-greater-than(A, B) | xs:boolean |
| A gt B | xs:string | xs:string | op:numeric-greater-than(fn:compare(A, B), 0) | xs:boolean |
| A gt B | xs:date | xs:date | op:date-greater-than(A, B) | xs:boolean |
| A gt B | xs:time | xs:time | op:time-greater-than(A, B) | xs:boolean |
| A gt B | xs:dateTime | xs:dateTime | op:datetime-greater-than(A, B) | xs:boolean |
| A gt B | xs:yearMonthDuration | xs:yearMonthDuration | op:yearMonthDuration-greater-than(A, B) | xs:boolean |
| A gt B | xs:dayTimeDuration | xs:dayTimeDuration | op:dayTimeDuration-greater-than(A, B) | xs:boolean |
| A lt B | 数 | 数 | op:numeric-less-than(A, B) | xs:boolean |
| A lt B | xs:boolean | xs:boolean | op:boolean-less-than(A, B) | xs:boolean |
| A lt B | xs:string | xs:string | op:numeric-less-than(fn:compare(A, B), 0) | xs:boolean |
| A lt B | xs:date | xs:date | op:date-less-than(A, B) | xs:boolean |
| A lt B | xs:time | xs:time | op:time-less-than(A, B) | xs:boolean |
| A lt B | xs:dateTime | xs:dateTime | op:datetime-less-than(A, B) | xs:boolean |
| A lt B | xs:yearMonthDuration | xs:yearMonthDuration | op:yearMonthDuration-less-than(A, B) | xs:boolean |
| A lt B | xs:dayTimeDuration | xs:dayTimeDuration | op:dayTimeDuration-less-than(A, B) | xs:boolean |
| A ge B | 数 | 数 | op:numeric-greater-than(A, B) or op:numeric-equal(A, B) | xs:boolean |
| A ge B | xs:boolean | xs:boolean | fn:not(op:boolean-less-than(A, B)) | xs:boolean |
| A ge B | xs:string | xs:string | op:numeric-greater-than(fn:compare(A, B), -1) | xs:boolean |
| A ge B | xs:date | xs:date | fn:not(op:date-less-than(A, B)) | xs:boolean |
| A ge B | xs:time | xs:time | fn:not(op:time-less-than(A, B)) | xs:boolean |
| A ge B | xs:dateTime | xs:dateTime | fn:not(op:datetime-less-than(A, B)) | xs:boolean |
| A ge B | xs:yearMonthDuration | xs:yearMonthDuration | fn:not(op:yearMonthDuration-less-than(A, B)) | xs:boolean |
| A ge B | xs:dayTimeDuration | xs:dayTimeDuration | fn:not(op:dayTimeDuration-less-than(A, B)) | xs:boolean |
| A le B | 数 | 数 | op:numeric-less-than(A, B) or op:numeric-equal(A, B) | xs:boolean |
| A le B | xs:boolean | xs:boolean | fn:not(op:boolean-greater-than(A, B)) | xs:boolean |
| A le B | xs:string | xs:string | op:numeric-less-than(fn:compare(A, B), 1) | xs:boolean |
| A le B | xs:date | xs:date | fn:not(op:date-greater-than(A, B)) | xs:boolean |
| A le B | xs:time | xs:time | fn:not(op:time-greater-than(A, B)) | xs:boolean |
| A le B | xs:dateTime | xs:dateTime | fn:not(op:datetime-greater-than(A, B)) | xs:boolean |
| A le B | xs:yearMonthDuration | xs:yearMonthDuration | fn:not(op:yearMonthDuration-greater-than(A, B)) | xs:boolean |
| A le B | xs:dayTimeDuration | xs:dayTimeDuration | fn:not(op:dayTimeDuration-greater-than(A, B)) | xs:boolean |
| A is B | node() | node() | op:is-same-node(A, B) | xs:boolean |
| A << B | node() | node() | op:node-before(A, B) | xs:boolean |
| A >> B | node() | node() | op:node-after(A, B) | xs:boolean |
| A union B | node()* | node()* | op:union(A, B) | node()* |
| A | B | node()* | node()* | op:union(A, B) | node()* |
| A intersect B | node()* | node()* | op:intersect(A, B) | node()* |
| A except B | node()* | node()* | op:except(A, B) | node()* |
| A to B | xs:integer | xs:integer | op:to(A, B) | xs:integer* |
| A , B | item()* | item()* | op:concatenate(A, B) | item()* |
| 演算子 | 演算数の型 | 関数 | 結果の型 |
|---|---|---|---|
| + A | 数 | op:numeric-unary-plus(A) | 数 |
| - A | 数 | op:numeric-unary-minus(A) | 数 |
この節の表は、静的文脈や動的文脈のさまざまな構成要素の有効範囲 (適用可能な範囲) を記述する。
以下の表では、静的文脈の構成要素について記述する。構成要素それぞれについて、"大域" とは、構成要素の値が XPath 式の全体を通して適用するということを表し、一方 "字句" とは、構成要素の値が、それが定義されている部分式の中でしか適用しないことを表している。
| 構成要素 | 有効範囲 |
|---|---|
| XPath 1.0 互換モード | 大域 |
| 静的既知名前空間 | 大域 |
| デフォルト要素/型名前空間 | 大域 |
| デフォルト関数名前空間 | 大域 |
| 有効範囲内スキーマ型 | 大域 |
| 有効範囲内要素定義 | 大域 |
| 有効範囲内属性定義 | 大域 |
| 有効範囲内変数 | 字句; for式と限量式では新しい変数を束縛することができる |
| 文脈項目静的型 | 字句 |
| 関数のシグネチャ | 大域 |
| 静的既知照合 | 大域 |
| デフォルト照合 | 大域 |
| 基底URI | 大域 |
| 静的既知文書 | 大域 |
| 静的既知コレクション | 大域 |
| 静的既知デフォルトコレクション型 | 大域 |
以下の表では、動的文脈のさまざまな構成要素に値がいかに割り当てられるかを記述している。これらの構成要素はホスト言語で定義される機構で初期化される。構成要素それぞれについて、"大域" とは、構成要素の値が、XPath式の評価の間ずっと変化しないことを表す。一方 "動的" とは、構成要素の値が、部分式の評価によって変更可能であることを表す。
| 構成要素 | 有効範囲 |
|---|---|
| 文脈項目 | 動的; 経路式や述語の評価の間変化する |
| 文脈位置 | 動的; 経路式や述語の評価の間変化する |
| 文脈サイズ | 動的; 経路式や述語の評価の間変化する |
| 変数の値 | 動的; for式と限量式では新しい変数を束縛することができる |
| 現在の日付と時間 | 大域; 実装によって初期化されなければならない |
| 暗黙的タイムゾーン | 大域; 実装によって初期化されなければならない |
| 利用可能文書 | 大域; 実装によって初期化されなければならない |
| 利用可能コレクション | 大域; 実装によって初期化されなければならない |
| デフォルトコレクション | 大域; 実装によって上書き可能 |
この仕様中の以下の項目は実装定義である:
式を構成するUnicodeの版
警告が発生する状況、および警告が処理される方法
エラーが外部処理環境に通知される方法
実装が[XML 1.0]や[XML Names]のルール、[XML 1.1]や[XML Names 1.1]のルールのいずれに基づいているか。これらのルール集合のうち1つが、実装のすべての局面で常に適用されなければならない。
実装が名前空間軸を支援するかどうか。
Note:
追加の実装定義の項目が[XQuery/XPath Data Model (XDM)]や[XQuery 1.0 and XPath 2.0 Functions and Operators]に列挙されている。
XPathは主に他の仕様で用いることができる構成要素を意図している。そのため、XPathはそれが用いられる仕様 ([XPointer]や[XSLT 2.0]など) に依存して、それぞれの環境に対してXPathの適合性規範が指定される。XPathの用い方に対して適合性規範を指定している仕様は、XPathの構文や意味の定義をこの仕様で与えられたものから変更してはならない。ただし、一部だけを使用したり、互換性のある拡張を行うことは許される。
[Definition: 静的型付け機能はXPathの選択可能な機能であり、[XQuery 1.0 and XPath 2.0 Formal Semantics]に定義されている静的型の支援を提供し、実装が静的解析相における型エラーを検出し通知するのに必要である。] XPathを用いる仕様は、静的型付け機能を用いるための適合性を指定してもよい。
実装が静的型付け機能を支援していないが、それにもかかわらず静的解析相において、ある式を実行時に評価すると型エラーが必然的に発生する、ということが決定できるならば、実装は、静的解析相においてエラーを発生させてもよい。このようなエラーを発生させるかどうかの選択は実装依存である。
ある場合には、[XQuery 1.0 and XPath
2.0 Formal Semantics]で定義されている静的型付けルールはあまり詳細ではない (例えば、parent,
ancestor, ancestor-or-self
など先祖に関する軸やfn:root関数に関する型推論ルールを見よ)。実装によっては、より詳細な静的型付けルールの支援を期待してもよい。
静的型付け機能を実装する適合性実装は、1つ以上の静的型付け拡張も用意してもよい。[Definition: 静的型付け拡張は実装定義の型推論ルールであり、[XQuery 1.0 and XPath 2.0 Formal Semantics]の型推論ルールによる推論よりもより詳細な静的型を推論する。]静的型付け拡張に関する制約の形式的定義については、6.1.1 Static Typing ExtensionsFSを見よ。
型エラーであり、静的解析相において、式が、その式の出現する文脈に適さない静的型を持っていると分かったり、動的評価相において、値の動的型が2.5.4 SequenceTypeの照合の照合ルールで指定された要求型と照合されない。
静的解析における型エラーであり、()またはdata(())以外の式に割り当てられた静的型がempty-sequence()である。
(現在は使われていない。)
(現在は使われていない。)
静的エラーであり、式が静的文脈で定義されていない要素名、属性名、スキーマ型名、名前空間接頭辞、変数名を参照している。ただし、ElementTestやAttributeTestの中での参照を除く。
実装は、その実装が支援しない軸の参照に出会うと、静的エラーを発生しなければならない。
エラー (ホスト言語環境はこのエラーを静的エラーと定義しても動的エラーと定義してもよい)であり、関数呼び出し中の引数の展開済QNameや引数の数が、静的文脈中の関数シグネチャの名前や次数と一致しない。
型エラーであり、経路式の最後のステップの結果が節点も原子値も含んでいない。
型エラーであり、経路式のステップ (最後のステップ以外) の結果が原子値を含んでいる。
型エラーであり、軸ステップで文脈項目が節点ではない。
(現在は使われていない。)
動的エラーであり、treat式の演算数の動的型がtreat式で指定された静的型と一致しない。このエラーは、"/" や
"//"
で始まる経路式のうち、その文脈節点が文書節点を根とする木の中にないときも発生する。これは、経路式の先頭の
"/" や "//" が、節treat as
document-node()を含む初期ステップの省略形だからである。
静的エラーであり、SequenceType中のAtomicTypeとして用いられるQNameが、有効範囲内スキーマ型中で原子型として定義されていない。
cast式やcastable式の目的型は原子型で、有効範囲内スキーマ型中になくてはならず、xs:NOTATIONやxs:anyAtomicTypeであってはならない。後ろに出現標識
"?" が続いてもよい。そうでない場合は静的エラーが発生する。
静的エラーであり、式で用いられているQNameが、静的既知名前空間を用いても名前空間URIに展開できない名前空間接頭辞を含む。
(現在は使われていない。)
fn:data関数を実行した結果として定義される。fn:collection関数の結果を表す。fn:doc関数をURIに適用すると、文書節点が返ってくる。fn:resolve-uri関数によって)相対URIを解決するのに必要なときに用いられる。T($arg)の意味は式($arg cast as
T?)と同じであると定義される。fn:current-dateTime関数によって検索することができる。もし式の実行の最中に複数回呼び出されると、この関数は常に同じ結果を返す。xs:string型とxs:anyURI型
(およびこれらから導出される型) の値を比較したり順序付けしたりする関数や演算子で用いられる照合順序として識別する。fn:collection関数を引数なしで呼び出したときに結果として得られる節点列である。xs:integer*、すなわち0以上の整数の列であっても、評価時には、その式の値が動的型xs:integer、すなわちただ1つの整数であってもよい)。fn:boolean関数を適用して得られる結果として定義される。xs:gYearMonth型,
xs:gYear型, xs:gMonthDay型,
xs:gDay型, xs:gMonth型を表す。xs:dayTimeDuration型の実装定義の値である。タイムゾーンの正しい値の範囲については[XML
Schema]を見よ。xs:integer型,
xs:decimal型, xs:float型,
xs:double型を表す。/" または
"//", で区切られている。また、経路式は "/" または
"//"で始まる場合もある。xs:NOTATIONやxs:anyAtomicTypeといった実体化不能型は除く。このような型の場合は、その導出型を用いることができる)。スキーマ型は複合型か単純型のいずれかである。単純型はさらにリスト型、共用体型、原子型に分けられる(これらの用語の定義と説明は[XML
Schema]を見よ)。fn:collection関数を用いて得られる可能性がある。型は節点列型であり、このURIを引数としてfn:collection関数を呼び出した結果となる。fn:collection関数を引数なしで呼び出した結果となる。fn:doc関数を用いて得られる可能性がある。型は、与えられたURIをリテラル引数とするfn:doc呼び出しの静的型である。fn:string関数を適用することで得ることができる。symbol ::= expression
type-name性質として参照されている)を持つ。節点の型注釈はスキーマ型であり、節点の文字列値と型付けされた値の関連を記述する。fn:data関数を適用することで得ることができる。trueであるのは、XPathバージョン1.0への後方互換性のためのルールが有効である場合である。そうでない場合はfalseになる。xs:anyAtomicTypeはすべての原子値を含む(そして原子値以外の値は含まれない)原子型である。この基礎型は、原子型を含むすべての単純型、リスト型、および共用体型が導出されるxs:anySimpleTypeである。xs:integer,
xs:string,
xs:untypedAtomicなど、すべての原始的原子型は基礎型としてxs:anyAtomicTypeを持つ。xs:dayTimeDurationはxs:durationから制限によって導出される。xs:dayTimeDurationの字句表現は、日、時、分、秒の部分だけを含むように制限されている。xs:untypedは、妥当性検証されていない要素節点、あるいはskipモードで妥当性検証された要素節点の型注釈として用いられる。xs:untypedAtomicは、より詳細な型が割り当てられていないテキストなど、型付けされていない原子データを示すのに用いられる原子型である。xs:yearMonthDurationはxs:durationから制限によって導出される。xs:yearMonthDurationの字句表現は、年と月の部分だけを含むように制限されている。この附録では、XPath 2.0 と[XPath 1.0]との非互換性の範囲についてのまとめを提供する。
3つの個別の場合が考えられる:
ソース文書がスキーマを持ち、XPath 1.0互換モードが true として走らせるときに存在する非互換性。この仕様では、このような状況での非互換性の数を極力削って完全に最小になるよう設計されているが、しかしいくつかの違いは残っている。これらをそれぞれ列挙する。
XPath 1.0 互換モードが false に設定されているときに生じる非互換性。この場合、互換性の失われる式の数はより多くなる。
ソース文書がスキーマを用いて処理されるときに生じる非互換性 (XPath 1.0互換モードが true に設定されているかどうかに関わらず)。スキーマを用いて文書を処理すると、節点の値を解釈する方法が変化する。これにより XPath 式が異なる結果を返す。
以下のリストには、この仕様の範囲内で、互換モードが true で動作する XPath 2.0 処理器が、XPath 1.0
処理器により同じ式を処理したときと異なる結果を生成するような既知の場合がすべて含まれている。ただし、その式は XPath 1.0
で妥当であり、ソース文書の節点は
xs:untypedとxs:untypedAtomic以外の型注釈を持たないと仮定する。
個々の関数の振舞いに関する非互換性はここには列挙していない。[XQuery 1.0 and XPath 2.0 Functions and Operators]の附録に含まれている。
XPath 1.0 も XPath 2.0 も、仕様のある面を実装定義として残しているため、特定の実装の振舞いについての非互換性で、この仕様の範囲外のものがあってもよい。それらの振舞いの面の一部はホスト言語で定義されている。
A < B < Cのように連続した比較演算子は XPath 1.0
では支援されるが、XPath 2.0 の文法では許されない。多くの場合、XPath 1.0
のこのような比較は直観的に明らかな意味を持たなかった。そのため、このような比較が現実に広く用いられているということは考えられない。このような構成要素が見つかれば、XPath
2.0 処理器は構文エラーを通知し、また構成要素を(A < B) <
Cと書き換えることができる。
文字列を数に変換するとき
(明示的にnumber関数を使うときも、暗黙的に関数呼び出しを行うときも)、XPath 1.0
において特別な値 NaNに変換される文字列は、XPath 2.0
ではNaN以外の値に変換される。これには+が先頭に書かれた数、指数による浮動小数点記法
(1.0e+9など)、文字列INFや-INFなどが含まれる。
XPath 2.0
は、空白の出現なしに、数リテラルの直後に文字から始まるトークンが置かれることを許さない。例えば、10div
3は XPath 1.0 では許されたが、XPath 2.0 では10 div
3というように書かれなければならない。
XPath 2.0 では名前空間軸は推奨されない。実装は、XPath 1.0 との後方互換性のため名前空間軸を支援してもよいが、支援する必要はない。(XSLT 2.0 は、XPath 後方互換性モードが支援されていれば、名前空間軸もまた支援されなければならない。しかし他のホスト言語では異なる適合性ルールを定義してもよい。)
XPath 1.0 互換モードが false に設定されていても、多くの XPath 式は XPath 1.0 の下でも XPath 2.0 の下でもやはり同じ結果を生成する。例外をこの節で述べる。
どの場合でも、質問中の式は XPath 1.0 の下で正しいと仮定する。また、XPath 1.0 互換モードが false
であり、すべての要素と属性はそれぞれxs:untypedまたはxs:untypedAtomicと注釈付けされていると仮定する。
以下の記述では、節点集合と数という用語を XPath 1.0 の意味で用いる。すなわち、XPath 1.0 のルールに従ってそれぞれ節点集合と数を生成する式を記述するのに用いる。
単一の節点や値を引数として期待する関数や演算子に、1個より多い節点を含む節点集合が引数として渡されたとき、XPath 1.0
のルールでは、1番目より後ろのすべての節点は捨てられる。XPath 2.0
では、1個より多い節点からなるときには型エラーが発生する。XPath 1.0
の振舞いは、述語[1]を用いて節点集合の最初の節点を明示的に選択することで、常に復元することが可能である。
XPath 1.0
では、<演算子や>演算子は、2つの文字列に対して適用されるときは、文字列をともに数に変換し、結果の間で算術比較を行っていた。XPath
2.0 では、これらの演算子はデフォルト照合順序列を用いて文字列比較を行う。(ただし、どちらかの値が数であれば、結果は XPath
1.0 と互換である)
数を引数として期待する関数や演算子に空の節点集合が引数として渡されると、値が暗黙的にNaNに変換される、ということはなくなった。XPath
1.0
の振舞いは、number関数を用いて明示的に変換を行うことにより、常に復元することが可能である。
より一般的には、関数や演算子の引数が要求型に暗黙的に変換されるということはなくなった。ただし、渡された引数がxs:untypedAtomicの場合を除く
(これはスキーマを持たない文書中の節点が引数として渡されたときの共通の場合である)。例えば、関数呼び出しsubstring-before(10
div 3, ".")は、XPath 2.0 では型エラーを発生する。XPath 1.0
の振舞いは、構成子関数や型変換を用いて要求型に明示的に変換を行うことにより、復元することが可能である。
節点集合とブール値を比較するルールが変更されている。XPath 1.0 では、$node-set =
true()のような式は、節点集合をブール値に変換した後ブール値の比較を行うことで評価していた。したがってこの式は、$node-setが空でなければtrueを返す。XPath
2.0
では、列と単一値列の間の他の比較と同様の方法で処理される。この式は、原子化および型変換ルールを用いたブール値への変換の後、値がtrueであるような節点が1つ以上$node-setに含まれていればtrueである。
このことは、$node-setが空であれば、XPath 2.0
の下での結果はブール型の演算数の値に関わらず、そしてどの演算子が用いられたかに関わらず、falseである、ということを意味している。$node-setが空でなければ、多くの場合、ブール値と比較した結果は失敗し、動的エラーを返すことが普通である。しかし、節点が値
"0", "1", "true", "false" を持っている場合は、式の評価は成功するかもしれない。
数とブール値の比較、数と文字列の比較、文字列とブール値の比較は XPath 2.0
では許されない。これらは型エラーになる。XPath 1.0
では、これらの比較は許されており、一方の演算数をもう一方の演算数の型に変換することで処理されていた。したがって、例えば XPath
1.0 では4 = true()は true であり、4 = "+4"は
false (なぜなら、文字列+4はNaNに変換されるから),
false = "false"は false であった
(なぜなら文字列"false"はブール値trueに変換されるから)。XPath
2.0 ではこれらの比較はいずれも型エラーである。
新たな数型が追加された。その結果、算術演算は integer, decimal,
単倍長浮動小数点、二倍長浮動小数点として計算してもよい。以前は、算術演算は常に二倍長浮動小数点として計算されていた。div演算子で2つの整数を除算した結果は、double
型ではなく decimal 型の値である。式10 div
0は、正の無限大を返すのではなく、エラーを発生する。
数を文字列に変換するルールが変更されている。これにより、数をスタイルシート外部に表示する方法が影響を受けるかもしれない。絶対値が1E-6から1E+6の範囲内である数に対しては、結果は全く同じであるべきである。しかしこの範囲外では、整数でないxs:floatやxs:doubleの値に対して科学的形式が用いられる。
文字列を数に変換するルールが変更されている。XPath 1.0 互換モードが true
の時に適用される変更に加えて、互換モードが false のとき、文字列
Infinityと-Infinityが正の無限大、負の無限大の表現として認識されることはなくなった。number関数は、すべての認識できない文字列をNaNに変換するという動作を続けるが、文字列を数に型変換する操作は、このような文字列に対して動的エラーを起こす。
XPath 2.0
の多くの演算では、1つ以上の演算数が空列であるとき、その結果として空列を生成する。演算が文字列を期待するとき、空列は通常長さ0の文字列と等価であるとみなされる。これは
XPath 1.0
の振舞いと互換である。しかし、演算が数を期待するとき、結果は等しくない。例えば、@widthが空列を返すならば、XPath
1.0 では@width+1の結果はNaNであった。しかし XPath 2.0
では、この結果は()である。この影響として、item[@width+1 !=
2]のような選別式は、XPath 1.0
では属性widthを持たない項目が選択されるが、XPath 2.0
ではそのような項目は選択されない。
XPath 2.0
におけるコメント節点、処理命令節点、名前空間節点の型付き値はxs:string型であり、xs:untypedAtomicではない。このことは、数を期待される文脈で値が用いられても暗黙的な変換は行われない、ということを意味している。例えば、もし処理命令節点が算術演算子の演算数として用いられるならば、XPath
1.0 では節点の文字列値を数に変換しようと試みていた (そして成功すればNaNを生成していた)。しかし
XPath 2.0 では型エラーを通知する。
XPath 1.0 では、A and Bの形の式では、Aが false であれば B
は評価されないと定義されていた。同様に、A or Bの場合には、A が true であれば B
は評価されなかった。XPath 2.0
では、これは保証されなくなった。実装は、2つの演算数をその順に評価しても並列に評価しても自由である。この変更により、索引により支援されるような巨大なデータコレクションに対して
XPath
式が評価されるような状況において、最適化の可能性がより大きくなる。実装は、この部分において後方互換性を保つことを選択してもよいが、そうすることは義務ではない。
スキーマに基づいて処理された文書にXPath式を適用すると、スキーマのない同じ文書に対して同じ式を適用した場合と常に同じ結果になるとは限らない。スキーマ処理はXPath 1.0 の式の結果に影響を与えないので、このことにより更なる非互換性が起こるかもしれない。この節では、起こりうる違いについて、いくつかの例を挙げる。
文脈節点が要素節点であり、以下のマークアップから導出されているとする: <background
color="red green blue"/>。XPath 1.0
では、述語[@color="blue"]はfalseを返す。XPath 2.0
では、属性colorがスキーマでxs:NMTOKENS型であると定義されていれば、同じ述語がtrueを返す。
同様に、式@birth < @deathを要素<person
birth="1901-06-06" death="1991-05-09"/>に適用することを考える。XPath
1.0 では、この式は false
を返す。なぜなら、2つの属性がともに数に変換され、どちらの場合もNaNを返すからである。XPath 2.0
では、スキーマ中にこれらの属性が日付であると注釈付けされていた場合、この式はtrueを返す。
いったんスキーマ検証が適用されると、要素や属性は、異なるデータ型を期待する式の演算数や引数として用いることはできない。例えば、日付に対してsubstring関数を適用して年を取得したり、数にsubstring関数を適用して整数部分を取得したりすることはできなくなった。同様に、属性がブール型と注釈付けされていると、それを文字列"true"や"false"と比較することはできない。これらの演算はすべて型エラーになる。このようなエラーが起こるときの救済策は、明示的な変換を導入するか、同じ計算を別の方法で行うかである。例えば、substring-after(@temperature,
"-")はabs(@temperature)と書き換えられるかもしれない。
静的型付け機能を提供している XPath 2.0 の実装では、XPath 1.0
の下では動作していた式についてさらに多くの型エラーが通知される。例えば、round(../@price)のような式は静的型エラーになるかもしれない。なぜなら処理器は、../@priceが数であるという保証を静的に推論することができないからである。
スキーマ検証は多くの場合、要素の内容に空白の正規化を行う
(要素の型に依存する)。これにより、string-length関数のような演算の結果が変化する。
スキーマ検証は、省略された属性や空の要素に対してデフォルト値を追加することによりデータモデルを拡張する。
This log records the substantive and significant editorial changes that have been made to this document since the Candidate Recommendation Draft of 03 November 2005. Minor editorial changes are not included in this log.
Deleted all references to the namespace
http://www.w3.org/2005/xpath-datatypes, formerly known
by the prefix xdt:, and moved all the schema types
defined in this namespace to the namespace
http://www.w3.org/2001/XMLSchema, known in this
document by the prefix xs:. All built-in schema types
used by XPath and XQuery are now consolidated in the
xs: namespace.
This change closes Bugzilla entry 2548. It affects many sections throughout this document and other XPath and XQuery specifications.
Deleted a paragraph requiring the functions fn:doc
and fn:collection to be stable (returning the same
results when called repeatedly.) Stability of these functions is
now covered in the Functions and Operators specification. The
functions are stable by default but an implementation may provide a
user option to relax this requirement.
This change closes Bugzilla entry 2553. Section affected: 2.4.4 入力源
A cast expression or constructor function whose target type is
xs:QName or is derived from xs:QName or
xs:NOTATION formerly required its operand to be a
literal string. Now it accepts either a literal string or an
expression whose base type is the same as the base type of the
target type. For example, it is now possible to cast a value of
type xs:QName to my:BigQName which is
derived from xs:QName.
This change closes Bugzilla entry 2678. Sections affected:
Error code XPST0083 is eliminated (all casts and calls to constructor functions with invalid operands raise XPTY0004.)
Modified the definition of Effective Boolean Value to specify
that a value of type xs:anyURI is treated the same as
a value of type xs:string (a consequence of placing
xs:anyURI and xs:string in the same
promotion hierarchy).
This change closes Bugzilla entry 2545. Section affected: 2.4.3 有効ブール値
When a namespace prefix cannot be resolved, error code XPST0081 is raised rather than the more generic error XPST0008.
This change closes Bugzilla entry 2447. Sections affected:
When the axis name is omitted from an axis step containing a
SchemaAttributeTest, the default axis is attribute.
Example: part/schema-attribute(color).
This change closes Bugzilla entry 2527. Section affected: 3.2.4 省略構文
Equality of QNames is defined by the eq operator,
which performs codepoint-comparisons of the namespace URIs and the
local names, ignoring the namespace prefixes. This is not a change,
but some editorial clarifications have been made in the XPath,
XQuery, and Functions and Operators documents. For example, phrases
such as "QNames are the same" have been replaced by "QNames are
equal as defined by the eq operator", and a new
example has been added to the section on Value Comparisons.
This change closes Bugzilla entry 2634. Sections affected: Minor editorial changes to various sections and to the definitions of error codes XQST0034 and XQST0049.
An implementation is not required to enforce cardinality constraints on operands that are not evaluated.
This change closes Bugzilla entry 2708. Section affected: 2.3.4 エラーと最適化
Entries for the eq and ne operators on
the types xs:yearMonthDuration and
xs:dateTimeDuration have been removed from the
operator mapping table. These operators are now handled by
promotion to xs:duration.
This change closes Bugzilla entry 2789. Section affected: B.2 演算子の写像
Editorial changes have been made to clarify that type promotions and subtype substitutions may be performed on the operands of all operators, including value comparisons. This is not a substantive change.
This change closes Bugzilla entries 2324 and 2631. Sections affected: 3.5.1 値比較 and B.2 演算子の写像.
Editorial changes have been made to clarify that a sequence of adjacent predicates is processed from left to right, and to clarify the assignment of context positions on reverse axes. This is not a substantive change.
This change closes Bugzilla entry 2500. Sections affected: 3.2.1 ステップ, 3.2.1.1 軸, 3.2.2 述語, and 3.3.2 選別式.
If multiple errors are detected, an implementation may report any non-empty subset of the detected errors.
This change closes Bugzilla entry 3122. Section affected: 2.3.1 エラーの種類.