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

2022-08-30 14:49:20

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

我需要找到具有“myClass”类的最后一个span元素的内容。我尝试了各种组合,但找不到答案。

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

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


答案 1

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

(//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;
}

答案 2

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

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

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

因此,表达式变得像VolkerK给出的那样。(//span[@class='myPrice'])[last()]


推荐