Использование :
(//h2[. = 'Foo bar'])[1]/following-sibling::p
[1 = count(preceding-sibling::h2[1] | (//h2[. = 'Foo bar'])[1])]
Если гарантируется, что каждый h2
имеет отдельное значение, это можно упростить до:
//h2[. = 'Foo bar']/following-sibling::p
[1 = count(preceding-sibling::h2[1] | ../h2[. = 'Foo bar'])]
Это означает, что : выберите все элементы p
, которые следуют за братьями и сестрами h2
(первый или единственный в документе), чье строковое значение равно 'Foo bar'
, а также первый предшествующий брат h2
длявсе эти p
элементы - это в точности h2 (first or only one in the document) whose string value is
'Foo bar'`.
Здесь мы используем метод определения, идентичны ли два узла :
count($n1 | $n2) = 1
равно true()
точно, когда узлы $n1
и $n2
являются одним и тем же узлом.
Это выражение может быть обобщено :
$x/following-sibling::p
[1 = count(preceding-sibling::node()[name() = name($x)][1] | $x)]
выбирает всех «ближайших родственников» любого узла, указанного в $ x .