PHP xpath - найти элемент со значением, а также получить элементы до и после элемента

Допустим, у меня есть этот XML:

<images>
    <photo>
        <thumbImg>images/thumbs/002.jpg</thumbImg>
        <filename>002</filename>
    </photo>
    <photo>
        <thumbImg>images/thumbs/008.jpg</thumbImg>
        <filename>008</filename>
    </photo>
    <photo>
        <thumbImg>images/thumbs/003.jpg</thumbImg>
        <filename>003</filename>
    </photo>
    <photo>
        <thumbImg>images/thumbs/006.jpg</thumbImg>
        <filename>006</filename>
    </photo>
    <photo>
        <thumbImg>images/thumbs/005.jpg</thumbImg>
        <filename>005</filename>
    </photo>
</images>

И я хочу найти элемент со значением имени файла 003, а затем найти элементы 1 до и 1 после этого элемента. Это все, чтобы я мог получить данные для функции «предыдущий / следующий», а также показать выбранное изображение на странице. Я думал, что это сработает:

$image_id = "003";
$project = $xml_object->xpath("photo[filename='$image_id']");

Но это print_r - пустой массив ... Может быть, есть простой способ сделать это с помощью xpath? Я подумал, что могу сделать это, просто пройдя цикл и поместив элементы prev / next во временный массив, а затем, как только он будет найден, разорвать цикл и вернуть временные данные, но я подумал, что xpath может сделать это немного больше элегантно.

РЕДАКТИРОВАТЬ: решено - вот более четкий ответ для узлов-братьев:

// for the one prior
//photo[filename='$image_id']/preceding-sibling::photo[1]
// for the one after
//photo[filename='$image_id']/following-sibling::photo[1] 

person jpea    schedule 08.06.2011    source источник


Ответы (1)


Использовать этот:

$project = $xml_object->xpath("//photo[filename='$image_id']");
person Femi    schedule 08.06.2011
comment
здорово, это работает - как бы вы тоже получили предыдущий и следующий элементы? - person jpea; 08.06.2011
comment
$project = $xml_object->xpath("//photo"); while(list( , $node) = each($project)) { var_dump($node); } будет перебирать весь цикл. - person Femi; 08.06.2011
comment
извините, чтобы уточнить - как я могу получить один элемент до и один элемент сразу после, а не все элементы фотографии - person jpea; 08.06.2011
comment
nevermind - понял - // фото [filename = '$ image_id'] / previous-sibling :: photo [1] для предыдущего, // фото [filename = '$ image_id'] / following-sibling :: photo [1 ] для одного после - person jpea; 08.06.2011
comment
Отлично. Придется помнить об этом. - person Femi; 08.06.2011