- 3.1 ロケーションステップ
- 3.2 軸 (Axes)
- 3.3 ノードテスト
- 3.4 ロケーションパス (詳細な記述方法)
3.3 ノードテスト
ノードテストとは、選択するノードのノード型と名前を指定するもののことをいい、軸によって選択されたノードの集合にさらに条件をつけます。以下に軸を含めたノードテストの構文を示します。
構文 | 意味 |
---|---|
child::para | コンテキストノードの para という名前の子要素を選択 コンテキストノードに para という名前の子要素がない場合には空 |
attribute::href | コンテキストノードの href という名前の属性を選択 コンテキストノードに href という名前の属性がない場合には空 |
child::* | コンテキストノードのすべての子要素を選択 |
attribute::* | コンテキストノードのすべての属性を選択 |
child::text() | コンテキストノードの子テキストノードを選択 |
child::node() | ノード型に関係なく、コンテキストノードのすべての子ノードを選択 |
attribute::href のように名前を指定したノードテストを使う場合には、どの軸を指定したかによってノードテストの対象となるノードの型が限定されます。この限定されたノードの型のことを主ノード型といいます。たとえば、軸が attribute や namespace である場合には、 主ノード型はそれぞれ、属性ノードと名前空間ノードになります。 それ以外の軸の場合の主ノード型は要素ノードとなります。ここでの注意点は、例えば child::* というロケーションステップは、 「コンテキストノードの子供にあたるノードすべて」を表すのではなく、 その中の要素ノードだけに限定され、テキストノードは含まれないということです。 テキストノードには、以下で紹介する別の方法が用意されています。
一方で、名前を指定しないでノードの種類だけを指定できるようなものがあります。ノードテストに、 text(), comment(), processing-instruction() と指定すると、 それぞれテキストノードやコメントノード、処理命令ノードという種類でなければならないことを表します。
ノードの種類が何でもいい場合には、 node() とします。 つまり、「コンテキストノードの子ノードすべて」を表すには、 child::node() とすれば良いことになります。
3.4 ロケーションパス (詳細な記述方法)
式の詳細については後の章に譲ることにし、この節では詳細な記述法によるロケーションパスの具体例をいくつか挙げ説明します。
following-sibling::track[position()=1]
コンテキストノードは no 属性の値が 3 である track 要素とします。ロケーションパスの意味は、「コンテキストノードの次の兄弟要素である
track 要素を選択する」ですので、選択される要素は no 属性の値が 4 である track 要素となります。
following と preceding、following-sibling、preceding-sibling において position()=N
とすると XML 文書中で対象となるノード集合中で N 番目の要素という意味ではなく、コンテキストノードから数えて N 番目の要素という意味となるので気をつけてください。
child::track[attribute::no="2"][position()=3]
コンテキストノードは trackListings とします。ロケーションパスの意味は、「コンテキストノードの子要素 track のうち no 属性が 2 の、3番目の要素を選択する」となります。上記の例の場合、 no 属性が 2 の track 要素は3つありますので、そのうちの3番目の要素を選択することになります。
child::track[position()=3][attribute::no="2"]
コンテキストノードは trackListings とします。ロケーションパスの意味は、「コンテキストノードの子要素 track のうち 3番目の要素の no 属性が 2 であればその track 要素を選択する」となります。この場合対象となるデータの no 属性は 3 ですから何も選択されないことになります。
child::trackListings[child::track]
コンテキストノードは cd とします。ロケーションパスの意味は、「コンテキストノードの子要素 trackListings のうち、track という子要素を一つ以上持つものを選択する」となります。この場合、trackListings は 4 つの track 要素を持っていますのでこの trackListings を選択することになります。
descendant::*[self::title or self::trackListings]
コンテキストノードは cd とします。ロケーションパスの意味は、「コンテキストノードの子孫要素のうち、title 要素、および trackListings 要素を選択する」となります。