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


PHP XPath selecting last matching element

可能的重复:
PHP SimpleXML。如何获取最后一项
XSLT选择包含特定子字符串的所有节点

我需要查找类为"myClass"的最后一个span元素的内容。我试过各种组合,但都找不到答案。

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

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

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

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

例如

<?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;
}

您使用的表达式表示"选择每个span元素,前提是(a(它有@class='myprice',并且(b(它是其父元素的最后一个子元素

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

(2( 形式为CCD_ 4的表达式表示选择每个元素的最后一个子跨度的CCD_。您需要使用括号来更改优先级:(//span)[last()]

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