文書の中から、条件に適合した部分の集合を取り出すための仕様です。1999年11月にW3Cより、XSLTと同時に勧告されました。文書の一部分として働くものです。XPathでは、要素や属性の部分をノードと呼びます。XML文書を、ルート・ノードを頂点とするツリー構造のモデルとして扱います。系の階層型ファイル・システムのパスと同じように指定しますが、関数や式を組み合わせて複雑な指定が可能となっています。XPathで特徴的なのは、URLやファイルシステムのパスのように、特定のものを指定するものではないということです。RDBに対するSQLのように、条件に適合するノードの集合を指定するものです。文書の、ルート・ノードの子ノードである全てのelem1要素の集合を返します。/elem1ノードルート・ノードはスラッシュ(/)で表現し、XML文書のルート要素(ドキュメント要素)は、ルート・ノードの子になります。その子である要素、属性、テキストなどのノードは、UNIX系のファイル・システムのパスと同様に、スラッシュで区切って階層を明示して参照します。その他の各ノード間は、親、子、兄弟などの関係を持つことになります。表1に、XPathで紹介されている7つのノードの種類を示しました。なしこれらのノードはDOMノードとは異なることに注意が必要です。node)を親とするが、当該要素ノードの子ではありません。属性ノードは、開始タグで明示的に指定された属性及び、デフォルト値を持つ明示的に指定されていない属性についてのみ、各々が属する要素を親ノードとして、ツリー構造中の属性ノードとなります。子要素にも意味が継承される属性の場合は、明示的に指定された親要素のみ、属性ノードが存在し、継承する子要素に明示的に指定されていなければ、当該属性のノードを持つことはありません。node)も、要素を親ノードとするが、その子ではありません。名前空間ノードは、要素ノードに対して、当該要素ノード及びその子孫のノードの名前空間毎に一個ずつ結び付けられます。xxxxx?>というい書式で、指定した処理系の動作を明示的に指定するものです。処理系側に受け取れるインタフェースが備わっていることが前提となり、XMLプロセッサは、未知の処理命令を無視することで、XML文書のポータビリティに影響が及ばないように振舞います。任意の場所に記述することが可能で、出現場所によって、ルート・ノード又は適当な要素ノードと親子関係をもちます。XML文書の冒頭に記述するXML宣言も、XML処理系に対する処理命令の一つだと考えることができますが、XPathではXML宣言は処理命令とは考えないので、XML宣言に対する処理命令ノードは存在しません。ロケーション・パスXPathで、XML文書のノードを指定するものを、ロケーション・パスと呼びます。ロケーションパスは、スラッシュで区切ってノード階層を表現します。ルート・ノードから指定する絶対ロケーションパスと、任意のノードを起点とする相対ロケーション・パスの二つに分かれます。起点とするノードのことをコンテキスト・ノード(文脈ノード)と呼び、絶対ロケーション・パスは、コンテキスト・ノードがルート・ノードであるロケーション・パスということになります。次のXML文書を例にとって、ロケーションパスを記述して見ましょう。</item></address>リスト1のitem要素の配下のaccess要素を指し示すための絶対ロケーション・パスの記述は次のようになります。/address/item/accessこの結果、リスト1の例では、マッチするのは4つのaccess要素全てとなります。ルートとその全ての子孫ノードのaccess要素にマッチするためには、次のように記述することもできます。//accessファイルパスと同様に、ワイルドカードにアスタリスク(*)を指定することも可能です。次のXPathはaddress要素の全ての子要素にマッチします。/address/*従って、"//*"とすれば、全ての要素にマッチすることになります。リスト2では、XPathを実際に利用するためのコードを、JAXPによるDOMベースのコードで示しました。}}リスト2では、前半部分でDOMツリーを構築しています。DOMツリー全体を現すDocumentノードのオブジェクトdocを生成するところまでは先のページで紹介しました。ここでは、簡便のために属性のセットやHandlerの設定などは省略してありますが、テストのためには問題なく動作します。必要があれば、適宜追加してください。DOMパーサの設定の次が、XPath用APIのためのコードです。XPathの低水準APIであるorg.apache.xpath.XPathAPIのstaticメソッドselectNodeIterator()の引数に、Documentノードのオブジェクトdocと、XPathを受け取るコマンド・ライン引数aregs[1]を渡し、org.w3c.dom.traversal.NodeIteratorオブジェクトを生成します。XPathは他の使用の部品として利用することになるため、この例のように、剥き出しで機能をつかうことは稀でしょうが、クラスXPathAPIに用意された少数のメソッドを使えば、ちょっとしたことには便利です。クラスNodeIteratorは、引数にコンテキスト・ノードとXPathを受け取って、マッチするノードのセットを返すイタレータ(反復子)となります。メソッドnextNode()やpreviousNode()で前後の要素に移動し、使い方はリスト3に挙げたとおりだ。コレクション・インタフェースのjava.util.Iteratorなどのイタレータとは異なり、前後の要素の存在判定と移動が同時に行われることに注意が必要です。リスト2の"XPathDemo.java"とリスト1のXML文書"XPathDemo.xml"を同じ場所に保存して実行してみましょう。"XPathDemo.xml"は、UTF-8で保存する必要があります。他の文字符号化方法を使う場合は、XML宣言を適宜書き換えなければなりません。実行結果は次のようになります。XML文書やXPathを適当に書き換えて、動作を確認してください。引数にはXML文書のパスを指定し、第二引数がXPathを指定します。14ロケーション・ステップXPathのスラッシュで括られた部分のことをロケーション・ステップと呼びます。先の例では、単純に要素名だけを記述しましたが、ロケーションステップには、次の情報を含めることで、よりきめ細かな指定が可能となります。軸(axis)...ノード間における「親/子/兄弟/祖先/子孫」などの関係を示す。tests)...要素名や型などマッチするノードの集合を示す。述部(predicates)...マッチしたノードの集合の中で「ある値より大きい」などより詳細な条件を示す。ロケーションステップは次の要領で記述します。軸::ノード・テスト[述語]先に挙げたロケーションパスは、これらの指定を省略した記法です。"/address/item/access"は、省略しないで書くと、次のようになります。/child::address/child::address/child::access軸ロケーション・ステップで、ノードのツリー構造における関係を示すのが軸(axes)と呼ばれる部分です。軸には表2に挙げた何れかを記述します。表2を使うと、あまりに仰々しいので、最初の例に挙げたように、これらを省略して記述することができます(表3)。先に挙げた//はdescendant-or-selfを意味する省略記法です。(XPathDemo.xml)で、item要素のsex属性を指定するには、次の何れかの記述が可能です。/child::address/child::item/attribute::sex又は、/address/item/@sexノード・テスト今までは、ノード・テストには要素名や属性名を単純に記述していました。他にも表4に挙げるような関数を使うことができます。関数とは云えませんが、先に例で挙げたワイルドカード*もノード・テストの特殊なものの一つです。ノード・テストの関数comment()コメント・ノードtext()テキスト・ノードprocessing-instruction()処理命令ノードnode()ノード・タイプに寄らない全てのノード*軸の指定するノード・タイプにマッチする全てのノード例えば、リスト1のXML文書でname要素のテキスト・ノードを参照するには、次のように記述します。/address/item/name/text()述部ノード・テストでマッチしたノードの集合に対して、関数や演算子を用いてさまざまな指定を記述するのが述部です。一般に、XPathを評価した結果は、オブジェクトと呼ばれ、クラスXPathAPIのメソッドeval()によって、四つの型が返されます。+--org.apache.xpath.objects.XNumberリスト3は、第一引数にXML文書のパス、第二引数にXPathを指定して、評価結果に応じた型を出力するものです。}}例えば、ロケーション・パスを第二引数に与えればXNodeSetが返されます。同様に、ノードを文字列に変換する関数string()を指定すればXStringが返され、ノードに含まれるノードの総数を返すlast()を指定すればXNumberが返されることになります。XNumber.string()やlast()以外にも、XPathでは、これらの型に応じて、ロケーション・ステップで利用するための、多くの関数が用意されています。表5と6に、利用できる代表的な関数と演算子を載せました。1.0仕様書をご参照ください。次に挙げるのは、XPath仕様で定義されている関数のうち、比較的良く使うであろう物です。引数を四捨五入した整数を返す次に挙げるのは、XPathの評価式中で利用可能な演算子の一覧です。大なりイコール例えば、リスト1のXML文書で、「sex="male"であるitem要素の子要素であるname要素の内容文字列」を指し示すには、次のように記述します。/address/item[@sex='male']/name/text()仕様としては二重引用符でも良いはずですが、Xalanは一重引用符でなければマッチしたとみなしません。XSLTでは、属性matchやselectといった、XSLT文書内の要素の、なんらかの属性の値として、専ら二重引用符の中で使うのであれば、一重引用符を使う必要があります。address要素の最後のitem子要素のaccess要素は次のように指定します。�������C�u。