WWW INFOMATION | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
XML top >>XPath
■ XPath
XPathは、次章で説明するXSLTで使用されるため、XML関連の仕様の中でもメジャーな言語です。仕様を理解するよりも、実際に使用してみるとすぐ理解できると思います。
以下、XPathについて説明します。
■ XPathとは
XPathとは、XML文章の中の要素や属性の位置を指定するための言語です。(XPath=
XML Path Language)
XPathは、XML文章をツリーとしてモデル化し、各ノード(要素や属性)への位置を指定できるようにします。また、指定したノードに対して、条件判定を行ったり、文字列計算をしたり、計算結果を使用したりすることも可能です。 ■ データモデル
XPathは、XMLのツリー構造をモデル化し、その中で属性や要素の位置を特定します。
例えば、以下のようなXMLのツリー構造があったとします。 このツリーを、XPathは以下のノードに分類し管理します。(ノードとは扱うデータというような意味)
XPathで使用するノードには以下の種類があります。
■ ロケーションパス
XPathの表記は、”ロケーションパス”と”軸とノードテスト”で構成されます。
ロケーションパスは、UNIXやURLと似たような表記方法で"/"を区切りとしてノードパスを示していきます。(windowsのフォルダをイメージするとわかりやすいと思います。"\"="/"と考えてください。) ロケーションパスでノードを区切り、軸とノードテストでそのノードが何かを示します。 ロケーションパスは、絶対表記と相対表記があり、絶対表記はルートノードから順に記述し、相対表記は、カレントからの位置関係を示します。 例を以下に示します。 [XML(単純・・)]
<?xml version="1.0"?>
<A> <B> <C></C> </B> </A> [絶対表記] ・Aの位置を指定
/a
・Bの位置を指定
/a/b
・Cの位置を指定
/a/b/c
[相対表記] カレントがBにあるとした場合。 ・Aの位置を指定
../
・Bの位置を指定
./
・Cの位置を指定
./c
■ 軸とノードテスト
ロケーションパスで説明しましたが、XPathでは、ロケーションパスでノードを区切り、軸とノードテストでそのノードが何かを示します。
軸は、ノードの方向を示し、例えば軸が"self"なら自分自身の階層を指し、軸が"parent"なら自分より一つ上の階層を意味します。ノードテストは、そのノードの意味を示し、例えば、コメントノードであれば、"comment()"で表現します。軸とノードの表記の仕様は以下のようになります。
軸の一覧を示します。
ノードテストの一覧を示します。
この軸とノードテストは、通常略記で示されます。以下、主要な略記と内容を示します。
<?xml version="1.0"?>
<members> <member num="01"> <name>山田太郎</name> <addr>東京都XXXXX</addr> <contact tel="03-xxxx-xxxx" e-mail="xx@xxxxx" /> </member> <member num="02"> <name>山田花子</name> <addr>大阪府XXXX</addr> <contact tel="06-xxxx-xxxx" /> </member> </members> memberに基準(カレント)があるものとします。(後述の述部が指定されていないため、当てはまるノード全てが示される位置となります。)
■ 術部
以下のようなXMLがあったとします。
<?xml version="1.0"?>
<members> <member num="01"> <name>山田太郎</name> <addr>東京都XXXXX</addr> <contact tel="03-xxxx-xxxx" e-mail="xx@xxxxx" /> </member> <member num="02"> <name>山田花子</name> <addr>大阪府XXXX</addr> <contact tel="06-xxxx-xxxx" /> </member> </members> このツリー構造は以下のようになっているとします。 このXMLで、"山田花子"というデータの位置を示したいと思います。
/members/member/name
というXPathでは、member要素の下のname要素全てを意味するため、山田太郎、山田花子の2つのノードを意味してしまいます。 そこで、XPathでは要素の絞込みを行うために述部を用意しています。術部の仕様は以下の通りです。
上記の例では、
/members/member/name[self::node()='山田花子']
でデータ位置を指定できます。(self::node()は略記でもよい。その場合".='山田花子'"と記述する。) また、述語は出現の順序でも表現できます。山田花子は、name要素の上から2番目に位置しています。この場合、以下の記述も可能です。
/members/member/name[2]
式で使用できる演算子は以下のものがあります。
/members/member/name[.='山田花子']/contact/@tel
・電話番号が'06-xxxx-xxxx'の人の名前
/members/member/name[contact/@tel='06-xxxx-xxxx']
・電話番号に03が付く人の名前(contain関数使用)
/members/member/name[contain(contact/@tel,'03']
■ 主要関数
述部で使用可能な主要関数を示します。
関数: number count(node-set) node-setのノードの数を返す。 sum 関数は、引数 node-set
の各ノードについてそのノードの文字列値を数値に変換した結果の合計を返す。 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||