PHP XPath选择最后一个匹配元素

时间:2011-04-04 10:18:36

标签: php xpath

  

可能重复:
  PHP SimpleXML. How to get the last item?
  XSLT Select all nodes containing a specific substring

我需要使用'myClass'类找到最后一个span元素的内容。我尝试了各种组合但找不到答案。

//span[@class='myPrice' and position()=last()]

这会返回所有带有'myClass'类的元素,我猜这是因为每个找到的元素都是处理时的最后一个 - 但我只需要实际的最后一个匹配元素。

2 个答案:

答案 0 :(得分:47)

您必须将要处理的处理器//span[@class='myPrice']标记为当前集,然后将谓词位置()= last()应用于该集。

(//span[@class='myPrice'])[last()]

e.g。

<?php
$doc = getDoc();
$xpath = new DOMXPath($doc);
foreach( $xpath->query("(//span[@class='myPrice'])[last()]") as $n ) {
  echo $n->nodeValue, "\n";
}


function getDoc() {
  $doc = new DOMDOcument;
  $doc->loadxml( <<< eox
<foo>
  <span class="myPrice">1</span>
  <span class="yourPrice">0</span>
  <bar>
    <span class="myPrice">4</span>
    <span class="yourPrice">99</span>
  </bar>
  <bar>
    <span class="myPrice">9</span>
  </bar>
</foo>
eox
  );
  return $doc;
}

答案 1 :(得分:7)

您使用的表达式意味着“选择每个span元素,前提是(a)它有@class='myprice',(b)它是其父级的最后一个子级。有两个错误:

(1)您需要在@class过滤后应用过滤器[position()=last()],而不是将其应用于所有span元素

(2)//span[last()]形式的表达式表示/descendant-or-self::*/(child::span[last()]),它选择每个元素的最后一个子跨度。您需要使用括号来更改优先级:(//span)[last()]

因此表达式变为(//span[@class='myPrice'])[last()],由VolkerK给出。