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

dea*_*eab 25 php xpath

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

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

//span[@class='myPrice' and position()=last()]
Run Code Online (Sandbox Code Playgroud)

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

Vol*_*erK 50

您必须标记要//span[@class='myPrice']作为当前集处理的处理器,然后将谓词位置()= 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;
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*Kay 7

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

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

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

所以表达式(//span[@class='myPrice'])[last()]就像VolkerK给出的那样.