可能重复:
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'类的元素,我猜这是因为每个找到的元素都是处理时的最后一个 - 但我只需要实际的最后一个匹配元素。
答案 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给出。