演算子および特殊文字 (XPath)
XPath 式は、次の表に示す演算子と特殊文字を使用して組み立てられます。
/ |
子演算子。左側のコレクションの直接の子を選択します。 このパス演算子がパターンの最初にある場合には、子がルート ノードから選択されることを表します。 |
// |
再帰降下。指定された要素を深さに関係なく検索します。 このパス演算子がパターンの最初にある場合には、ルート ノードからの再帰降下を示します。 |
. |
現在のコンテキストを表します。 |
.. |
現在のコンテキスト ノードの親。 |
* |
ワイルドカード。要素名に関係なくすべての要素を選択します。 |
@ |
属性。属性名のプレフィックス。 |
@* |
属性のワイルドカード。名前に関係なくすべての属性を選択します。 |
: |
名前空間の区切り記号。名前空間のプレフィックスを要素名や属性名と区別します。 |
( ) |
演算をグループ化し、明示的に優先順位を付けます。 |
[ ] |
フィルター パターンを適用します。 |
[ ] |
添字演算子。コレクション内のインデックス化に用います。 |
+ |
加算を行います。 |
- |
減算を行います。 |
div |
IEEE 754 に従い浮動小数点除算を行います。 |
* |
乗算を行います。 |
mod |
除算で切り捨てる際の剰余を返します。 |
この表には論理演算子と集合演算子は含まれません。それらは論理式、比較式、およびセット式または集合の演算に一覧されています。
優先順位は次の表で (高いものから順に) 定義されています。
優先順位 |
文字 |
目的 |
---|---|---|
1 |
( ) |
グループ化 |
2 |
[ ] |
フィルター |
3 |
/ // |
Path 演算 |
グループ演算子 () は最上位のパス式にのみ適用されます。 たとえば、(//author/degree | //author/name) は有効なグループ化演算ですが、//author/(degree | name) は無効です。
フィルター パターン演算子 ([]) は、パス演算子 (/ および //) よりも優先されます。 たとえば式 //comment()[3] は、ドキュメント内ですべてのコメントの親から相対的にインデックスが 3 に等しいすべてのコメントを選択します。 これは、式 (//comment())[3] とは異なり、この場合は親から相対的なすべてのコメントの集合から第 3 番目のコメントを選択します。 最初の式は複数のコメントを返す場合がありますが、後者は 1 つのコメントしか返しません。
これらの演算子と特殊文字については、このリファレンス全体で詳細に説明されています。
パス演算子
パス演算子 (/ および //) を使用して、特定のタイプの要素のコレクションを決定することができます。 これらの演算子は、その "左側" のコレクションを選択処理の対象を表す引数としてとり、"右側" のコレクションを選択すべき要素を表す引数としてとります。 子演算子 (/) は左側のコレクションの直接の子から選択し、一方、降下演算子 (//) は左側のコレクションの任意の子孫から選択します。 実質的に // は、階層の 1 つ以上のレベルを代替するものと考えることができます。
パス演算子で照会が行われるたびにコンテキストが変わることに注意してください。 パス演算子を組み合わせることにより、ドキュメント ツリーを任意に移動することができます。
例
式 |
説明 |
---|---|
author/first-name |
現在のコンテキスト ノードの <author> 要素内にあるすべての <first-name> 要素。 |
bookstore//title |
<bookstore> 要素内の 1 段階以上深いレベル (任意の子孫) に含まれているすべての <title> 要素。 これはパターン bookstore/*/title とは異なることに注意してください。 |
bookstore/*/title |
<bookstore> 要素の孫であるすべての <title> 要素。 |
bookstore//book/excerpt//emph |
<bookstore> 要素内の任意の場所に含まれる、<book> 要素の子である <excerpt> 要素内のどこかにあるすべての <emph> 要素。 |
.//title |
現在のコンテキストから 1 レベル以上の深さにあるすべての <title> 要素。 この状況は、ピリオド表記が必須である場合において、基本的に 1 回だけ発生することに注意してください。 |
ワイルドカード文字
要素は、ワイルドカード (*) コレクションで置き換えることによって、要素名を使用せずに参照することができます。 * コレクションは、タグの名前に関係なく、現在のコンテキストの子であるすべての要素を指します。
例
式 |
説明 |
---|---|
author/* |
<author> 要素の子であるすべての要素。 |
book/*/last-name |
<book> 要素の孫であるすべての <last–name> 要素。 |
*/* |
現在のコンテキストのすべての孫要素です。 |
my:book |
my 名前空間の <book> 要素。 |
my:* |
my 名前空間のすべての要素。 |
パターン *:book はサポートされないことに注意してください。
属性
XPath では属性名を @ 文字で表します。 属性と子要素は同等に扱われます。可能な場合常に、これらは同等の機能を持ちます。
注意
属性に子要素を含めることはできません。そのため、属性にパス演算子を適用すると構文エラーとなります。また、属性には順番が定義されていないので、属性にインデックスを適用することはできません。
例
式 |
説明 |
---|---|
@style |
現在のコンテキストの要素の style 属性。 |
price/@exchange |
現在のコンテキスト内の <price> 要素の exchange 属性。 |
book/@style |
すべての <book> 要素の style 属性。 |
属性は子を持つことができないので、次の例は無効です。
price/@exchange/total
複数の属性の検索
@* を使用すると、特定の要素の全属性が返されます。 この方法は、属性をレコード内のフィールドとして取り扱うアプリケーションで役立つ可能性があります。
例
式 |
説明 |
---|---|
@* |
現在のコンテキスト ノードのすべての属性。 |
@my:* |
my 名前空間のすべての属性。 これには、my 名前空間の要素に対して修飾されていない属性は含まれません。 |
パターン @*:title はサポートされないことに注意してください。