Противоположность функции last () - PullRequest
0 голосов
/ 02 декабря 2011

Что является противоположностью функции last() XPath, чтобы выбрать «первый» (очевидно, нет 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 ]

3 голосов
/ 02 декабря 2011

Было бы странно предложить 1?

РЕДАКТИРОВАТЬ : удалите // лидер в вашем коде.

2 голосов
/ 02 декабря 2011

Ну, первый элемент всегда тот, который выбран с позицией 1, поэтому вам не нужна функция для этого, вы можете просто сделать, например, foo[1] или //bar[1].

1 голос
/ 02 декабря 2011

Проблема в том, что значение выражения //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
1 голос
/ 02 декабря 2011

Просто используйте 1 в качестве индекса первого результата.Точка last() такова, что вы можете выбрать последний индекс из переменного числа индексов.Но первый индекс всегда 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...