xpathで複数のclassが指定されたタグを取得する

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実践マスター



4798113727
標準講座 XQuery (Programmer’s SELECTION)

関連記事

コメントを残す

メールアドレスが公開されることはありません。