XPath last()
函数的反义词是什么,从查询中选择“first”(显然,没有first()
)结果?
或者,我将如何模仿它?
可能问题出在我使用祖先和上下文的具体示例中。
document.html
<div id="holder" special-header="We have a special header here">
<div class="element" special-header="And this is even more specific">
<p id="interested">Content, content</p>
</div>
</div>
的script.php
$doc = new DOMDocument;
$doc->loadHTMLFile('document.html');
$contextNode = $document->getElementById('interested');
/* first try */
$first = $xpath->query('//ancestor::*[@special-header][1]', $contextNode);
echo $first->getAttribute('special-header'); // result == "We have a special header here" intended == "And this is even more specific"
/* second try */
$one = $xpath->query('//ancestor::*[@special-header][last()]', $contextNode); // in case it starts from "first found ancestor" and descends
echo $one->getAttribute('special-header'); // same result as before..
尝试position()=1
我再次得到相同的结果。
答案 0 :(得分:3)
建议1
会不会很奇怪?
编辑:删除代码中的//
个人。
答案 1 :(得分:2)
第一项始终是使用位置1
选择的项目,因此您不需要其中的功能,您可以简单地执行以下操作: foo[1]
或//bar[1]
。
答案 2 :(得分:1)
只需使用1
作为第一个结果的索引。 last()
的重点是,您可以从可变数量的索引中选择最后一个索引。但第一个索引总是1
。
答案 3 :(得分:1)
问题是表达式//ancestor::*[@special-header]
的含义相当模糊,因为//
强制从根节点进行搜索。
解决方案是删除表达式开头的//
。
$html = <<<HTML
<div id="holder" special-header="We have a special header here">
<div class="element" special-header="And this is even more specific">
<p id="interested">Content, content</p>
</div>
</div>
HTML;
$doc = new DOMDocument();
$doc->loadHTML($html);
$contextNode = $doc->getElementById('interested');
$xpath = new DOMXpath($doc);
$first = $xpath->query('ancestor::*[@special-header][1]',
$contextNode) -> item(0);
echo $first->getAttribute('special-header') . "\n";
$one = $xpath->query('ancestor::*[@special-header][last()]',
$contextNode)-> item(0);
echo $one->getAttribute('special-header') . "\n";
结果:
C:\>\php\php.exe dom_games.php
And this is even more specific
We have a special header here