ルートノード要素ノードテキストノード属性ノード名前空間ノード処理命令ノードコメントノードロケーションパス[編集]XPathで最も一般的な式は、ロケーションパスである。ロケーションパスにより、XML文書のあるノード(現在のコンテクストノード)を基準として、別のノードもしくは複数のノード(ノード集合)が指定される(指定されるノードが0個すなわち1個も存在しない場合もある)。ロケーションパスは、1つまたは複数のロケーションステップの並びとして記述される。複数のロケーションステップでロケーションパスが記述される場合、各ロケーションステップは/により区切られる。ロケーションステップ[編集]ロケーションパスを構成する各ロケーションステップは、次の3つの要素から構成される。(predicate)ロケーションステップは次の2種類の構文を使って記述することができる。簡潔でXPathの式を読みやすく書きやすく記述することができる。直観的で多くの場合親しみやすい文字列と構文で記述する。省略構文と比べて記述が冗長ではあるが、省略構文より多くのオプションを指定することができ、またXPath式を注意深く読む際には省略構文より説明的に記述していることがXPath式の正確な理解に役立つ。省略構文[編集]省略構文は簡潔な構文であり、よく使われる多くの既定値を使い省略してロケーションステップを記述することができる。省略構文による簡単なロケーションパスの記述例を示す。/A/B/Cこの例では、先頭が/となっている絶対パスであり、0個以上のC要素を選択する。element)であり、そのB要素はA要素の子要素であり、A要素はそのXML文書のルート要素である。Identifier)の構文やファイルパスの構文に似せて、設計されている。省略構文では、先の例より複雑な式を記述することもできる。完全な構文と比べると記述能力は制限される。既定のchild軸以外にもいくつかの軸(attribute軸、descendant-or-self軸、self軸、parent軸)を指定することができる。簡明なノード名による指定以外のノードテストを指定することができる。どのロケーションステップにも角括弧[と]を後ろにつけて述語を指定することができる。複雑なロケーションパスの例を示す。A//B/*[1]この例は、先頭が/となっていない相対パスであり、任意の名前の(*)最初の要素([1])を選択する。選択された「最初の要素」はB要素の子要素(/)であり、そのB要素はA要素の直接的または間接的な子要素(子孫要素、//)であり、そのA要素は現在のコンテクストノードの子要素である。省略構文の一覧と正式な定義については後の#完全な構文と省略構文の対応関係の節で示す。完全な構文[編集]完全な構文の一般式は以下の形となる。/軸方向::名前空間:ノードテスト[述語]/~~先の#省略構文の節で示した2つの例を、省略しない完全な構文によって書き直すと次のようになる。軸をchildやdescendant-or-selfのように明示的に指定する。軸の指定に続けて::を記述し、さらにノードテストをAやnode()、*のように記述する。省略構文と同様に、ノードテストの指定に続けて角括弧[と]を後ろにつけて述語を指定することができる。軸[編集]ロケーションステップの軸の記述は、XML文書の木構造において、方向を指定する。XPath仕様で定義されている13種類の軸(#完全な構文)を示す。childコンテクストノードの子ノードdescendantコンテクストノードの子孫ノードparentコンテクストノードの親ノードancestorコンテクストノードの祖先ノードfollowing-siblingコンテクストノードの兄弟ノードのうち後方のノードpreceding-siblingコンテクストノードの兄弟ノードのうち前方のノードfollowingXML文書の文書順でコンテクストノードより後方にある全てのノードprecedingXML文書の文書順でコンテクストノードより前方にある全てのノードattributeコンテクストノードが要素の場合、その属性ノードnamespaceコンテクストノードが要素の場合、その名前空間ノードselfコンテクストノード自身descendant-or-selfコンテクストノード自身とコンテクストノードの子孫ノードancestor-or-selfコンテクストノード自身とコンテクストノードの祖先ノード省略構文でattribute軸を使う例を示す。//a/@hrefこの例では、href属性ノードの集合を選択する。href属性ノードは、XML文書内のいずれかのa要素ノードに属している。self軸は、後述する述語の中でその述語の直前のノードテストで選択されたノードを記述するためによく使われる。h3[.='関連項目']この例では、カレントノードの子ノードであり、かつ内容のテキスト'関連項目'をもつh3要素が選択される。ノードテスト[編集]ロケーションステップのノードテストは、式もしくは特定のノード名によって記述される。名前空間接頭辞gsが定義されているXML文書で、//gs:enquiryとノードテストが記述された場合、gs名前空間下のenquiryをノード名とする全てのノードの集合が、このノードテストの指定の対象となる。:名前」という書式でもよく、attribute軸とnamespace軸以外の軸の場合は、その名前をもつ全ての要素ノードを指定する。attribute軸の場合はその名前の全ての属性ノードを指定し、namespace軸の場合は名前空間ノードを指定する。text()全てのテキスト(文字列)ノードを指定する。<k>こんにちは</k>の中の'こんにちは'comment()全てのXMLコメントノードを指定する。-->processing-instruction()全てのXML処理命令ノードを指定する。?>processing-instruction(処理命令ターゲット)という書式での記述も可能であり、この例の場合はprocessing-instruction('xsl-stylesheet')と記述すると指定対象となる。node()全てのノードを指定する。*主ノード型の全てのノードを指定する。ここで主ノード型とは、attribute軸とnamespace軸以外の軸の場合は要素ノードを意味し、attribute軸の場合は属性ノードを、namespace軸の場合は名前空間ノードを、それぞれ意味する。名前空間接頭辞:*名前空間接頭辞が示す名前空間に属する全ての主ノード型のノードを指定する。完全な構文と省略構文の対応関係[編集]ロケーションステップの完全な構文と省略構文の対応関係を次に示す[2][5]。コンテクストノードの親ノード述語[編集]ロケーションステップでは、ノードテストの後に、角括弧でくくる述語で複雑な式を記述して、ノードテストで指定されたノード集合を絞り込むことができる。ノード集合を絞り込む必要が無い場合は、述語は記述しない。//a[@href='help.php']この例では、[@href='help.php']の部分が述語である。このXPath式は、href属性をもち、かつその属性値が'help.php'である、全てのa要素ノードを指定する。先の例では述語の数は1つであったが、ロケーションパスを構成するロケーションステップごとに、複数の述語を指定することができる。絞り込み条件を複数重ねて指定することができる。指定できる述語の数に制限は無い。述語は、その述語を含むロケーションステップのコンテクストを変更することは無い。その直前のノードテストで指定されたノード集合がそのロケーションステップのコンテクストであり、述語が指定されることでコンテクストが変更されることは無い。//a[@href='help.php'][name(..)='div'][../@class='header']/@targetこの例は、a要素のtarget属性の値を指定する。このXPath式の最初のロケーションステップには3つの述語が記述されており、a要素のうちa要素のhref属性の値が'help.php'であり、また、a要素の親要素の要素名がdivであり、また、親要素(div)のclass属性の値が'header'である、a要素のみが、最初のロケーションステップの指定対象となる。最終的には、最初のロケーションステップで絞り込まれて指定対象となったa要素のtarget属性が指定されることになる。規定されているデータ型と演算子、関数を説明する。データ型は次の4種類が定義されている。