Допустим, у меня есть этот 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]