Одно выражение XPath, которое выбирает требуемые элементы: :
/*/h2[1]
/following-sibling::p
[count(. | /*/h2[2]/preceding-sibling::p)
=
count(/*/h2[2]/preceding-sibling::p)
]
В общем, в таких случаях можно использовать формулу Кейсиана для пересечения множества:
$ns1[count(.|$ns2) = count($ns2)]
Это выражение XPath выбирает все узлы, принадлежащие и к наборам узлов $ns1
и $ns2
.
Если вы хотите получить все узлы между двумя заданными узлами $ n1 и$ n2, это пересечение двух наборов узлов: $n1/following-sibling::node()
и $n2/preceding-sibling::node()
.
Просто подставьте эти выражения в формулу Кейсиана, и вы получите искомое выражение XPath.
Конечно, в XPath 2.0 можно использовать оператор <<
или >>
, например:
/*/h2[1]/following-sibling::p[. << /*/h2[1]/]