PHP XPath 选择最后一个匹配元素
我需要找到具有“myClass”类的最后一个span元素的内容。我尝试了各种组合,但找不到答案。
//span[@class='myPrice' and position()=last()]
这返回所有带有类“myClass”的元素,我猜这是因为每个找到的元素都是处理时的最后一个 - 但我只需要实际的最后一个匹配元素。
我需要找到具有“myClass”类的最后一个span元素的内容。我尝试了各种组合,但找不到答案。
//span[@class='myPrice' and position()=last()]
这返回所有带有类“myClass”的元素,我猜这是因为每个找到的元素都是处理时的最后一个 - 但我只需要实际的最后一个匹配元素。
您必须为要视为当前集的处理器进行标记,然后将谓词 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;
}
您使用的表达式表示“选择每个 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()]