Our XML example we are going to use.
<div id="cities">
<country>France</country>
<city>Paris</city>
<country>UK</country>
<city>London</city>
<city>Manchester</city>
<city>Liverpool</city>
<country>Denmark</country>
<city>Copenhagen</city>
<country>Ukraine</country>
<city>Kiev</city>
<city>Odessa</city>
</div>
Taking all city elements after element UK
/div/country[.='UK']/following-sibling::city
<city>London</city>
<city>Manchester</city>
<city>Liverpool</city>
<city>Copenhagen</city>
<city>Kiev</city>
<city>Odessa</city>
Taking all city elements before element Denmark
/div/country[.='Denmark']/preceding-sibling::city
<city>Paris</city>
<city>London</city>
<city>Manchester</city>
<city>Liverpool</city>
Let's increase difficulty little bit and try to use preceding-sibling and following-sibling in the brackets []
Taking all city elements following till first country is UK
/div/city[following-sibling::country='Denmark']
<city>Paris</city>
<city>London</city>
<city>Manchester</city>
<city>Liverpool</city>
Taking all city elements from bottom till first country is Denmark
/div/city[preceding-sibling::country='Denmark']
<city>Copenhagen</city>
<city>Kiev</city>
<city>Odessa</city>
Let's increase difficulty even more and start using both preceding-sibling and following-sibling in one xpath.
Taking all city elements between two elements
In this example I'm going to get cities after UK and before Ukraine. /div/city[preceding-sibling::country='UK' and following-sibling::country='Ukraine']
<city>London</city>
<city>Manchester</city>
<city>Liverpool</city>
<city>Copenhagen</city>