xmlのデータから特定のタグ(ノード)を取得するにはxpathを指定すると便利です。
例えば、以下のxpath式では、xml内にあるliタグを検索する事が出来ます。
//li |
さらに、xpath式では特定の属性値を持つデータのみを絞り込む事も可能です。
例えば以下のようなxhtmlがあった場合に…
<ul> <li class="row-data"> ... </li> <li class="row-data"> ... </li> <li class="row-data"> ... </li> <li class="row-data"> ... </li> <li class="row-data"> ... </li> </ul> <ul> <li class="menu-data"> ... </li> <li class="menu-data"> ... </li> <li class="menu-data"> ... </li> </ul> |
classがrow-dataであるliタグのみを抽出したい場合は、以下のxpath式を使用します。
//li[@class="feedbackRow"] |
xhtmlでは、タグに対してclassを複数指定することが出来るのですが、以下のようなデータから検索を行いたい場合どのようにすればよいでしょうか?
<ul> <li class="row-data row-even"> ... </li> <li class="row-data row-odd" > ... </li> <li class="row-data row-even"> ... </li> <li class="row-data row-odd" > ... </li> <li class="row-data row-even"> ... </li> </ul> |
案1:2回のクエリに分ける
簡単な方法として思いつくのは、以下のようにxpath式を2つ用意し、プログラム側でマージするという方法があります。
//li[@class="feedbackRow row-even"] //li[@class="feedbackRow row-odd"] |
ただ、classに”row-even row-data”と指定された場合は、対応できません。
この方法は簡単ですが、classが複数指定可能で、種類数が多い状況では現実的では有りません。
案2:contains関数を使用する
xpathでは、”=”を使用した比較式のほかにも、関数を使用することが可能です。
今回は、classに”row-data”という文字を含むタグのみを取得したいので、下記のxpath式で期待したタグを抽出する事ができます。
//li[contains(@class,'feedbackRow')] |
xpath関数には、contains以外にも多数用意されており、文字列処理系では他に、concat, normalize-space, string, string-length, substring-after, substring-before, translate等が有ります。
XSLT XPath実践マスター

標準講座 XQuery (Programmer’s SELECTION)
関連記事
コメントを残す