ロケーションパスを理解
XPath式はノードセット以外にも、文字列、数値、真偽値を返すことができます。前編ではXPathは「特定の箇所を指定するためのものである」と説明しましたが、ノードの説明が終わったので、より正確な「XPathはノードセットを指定するためのもの」という表現に置き換えます。
ノードセットを指定するために使うのがロケーションパスです。前編で作成したXSLTスタイルシートで/MEIGARAS/*[.=current()]というコードがありますが、これがロケーションパスです。/(または//)で区切られたものをステップと呼びます。この例ではMEIGARASと*[.=current()]がステップです。
- ステップ=軸::ノードテスト[述語]
- 絶対ロケーションパス=/ステップ/ステップ/・・・
または - 相対ロケーションパス=ステップ/ステップ/・・・
つまり、ルートノードから指定するものを絶対ロケーションパス、コンテキストノードから指定するものを相対ロケーションパスと呼びます。
それでは、ステップを構成する軸、ノードテスト、述語について順に説明します。以下で説明するのは省略しない記法です。省略形についてはXML Path Language (XPath) Version 1.0で確認してください。
軸(Axis)
軸とはコンテキストノードから見てどの方向を指すのかに使用されます。13の軸が存在し、そのすべてを次に示します。
child
コンテキストノードの子(複数存在すればそれらすべて)を指します。
descendant
コンテキストノードの子孫のノードを指します。子孫とは子、子の子、子の子の子という具合です。属性と名前空間は要素ノードの子ではないためdescendantには含まれません。
descendant
コンテキストノードの親を指します。
ancestor
コンテキストノードの先祖を指します。先祖とは親、親の親、親の親の親という具合です。最終的にはルートノードも含まれます。ただし、ルートノードではancestor軸は意味を持ちません。
following-sibling
コンテキストノードに続く兄弟ノードを指します。属性と名前空間には兄弟は存在しないため、属性と名前空間のfollowing-sibling軸は空です。
preceding-sibling
コンテキストノードの前に存在する兄弟ノードを指します。属性と名前空間には兄弟は存在しないため、属性と名前空間のpreceding-sibling軸は空です。
following
XML文書は上から下へと順序が存在します。ツリー構造で言えば上から下、左から右という順序が存在します。following軸はコンテキストノードの文書順に従ってそれより後に存在するすべてのノードを指します。ただし、属性と名前空間は含まれません。
preceding
XML文書は上から下へと順序が存在します。ツリー構造で言えば上から下、左から右という順序が存在します。preceding軸はコンテキストノードの文書順に従ってそれより前に存在するすべてのノードを指します。ただし、属性と名前空間は含まれません。
attribute
コンテキストノードのすべての属性を指します。従って、コンテキストノードが要素ノードでない場合、attribute軸は空です。
namespace
コンテキストノードのすべての名前空間ノードを指します。従って、コンテキストノードが要素ノードでない場合、namespace軸は空です。
self
コンテキストノード自身を指します。
descendant-or-self
コンテキストノード自身とコンテキストノードの子孫を指します。
ancestor-or-self
コンテキストノード自身をコンテキストノードの先祖を指します。ルートノードの場合、ルートノード自身を指します。
ノードテスト(Nodetest)
軸の場合、どの方向を指すのかを示しているため分かりやすい概念です。ノードテストと言うと難しく聞こえますが、軸で示されたノードの中でどの要素を使用するのかを示すためのもので、次の4つの関数を指します。さらに、ノードの名前やワイルドカード(*)もノードテストとみなすことができます。
- text():軸で示したノードの中からテキストノードを選択します
- commnet():軸で示したノードの中ならコメントノードを選択します。
- processing-instruction():軸で示したノードの中から処理命令ノードを選択します
- node():軸で示したノードの中からノードであれば何でも選択します
述語(Predicate)
述語とは軸とノードテストで指定されたノードセットをさらに絞り込む場合に使用します。ステップで示したように述語は[]の中にXPath式を記述し、真の場合に軸とノードテストで指定したノードをロケーションパスの指定対象とします。述語が記述されない場合、軸とノードテストで指定されたノードセットがロケーションパスとなります。述語が真となる条件はXPath式が返す型によって決まります。
- ノードセット:空以外の場合は真、空の場合は偽
- 数値:0以外は真、0は偽
- 文字列:空文字("")以外は真、空文字は偽
- ブール値:論理演算の結果が真であれば真、偽であれば偽(論理演算以外では常に真を返すtrue()関数と常に偽を返すfalse()関数があります)
