与last()函数相反

时间:2011-12-02 10:58:05

标签: php dom xpath

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我再次得到相同的结果。

4 个答案:

答案 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