Подтвердить что ты не робот

Объединяя использование предыдущего и следующего собора в одном и том же запросе xpath

У меня довольно простая проблема, но я не могу ее решить. Скажем, у меня есть следующий код:

<a>
    <b property="p1">zyx</b>
    <b>wvu</b>
    <b>tsr</b>
    <b property="p2">qpo</b>
    <b>qcs</b>
</a>

Я хочу выбрать узлы между b node, у которого есть property="p1" и b node, у которого property="p2". Я могу сделать любой из тех, у кого есть предыдущий брат и ось следующего брата, но я не могу найти, как объединить оба.

4b9b3361

Ответ 1

XPath 1.0:

/a/b[preceding-sibling::b/@property='p1' and following-sibling::b/@property='p2']

XPath 2.0:
Вышеприведенное выражение имеет некоторые причуды в XSLT 2.0, лучше использовать новые и более безопасные операторы << (до) и >> (после).

/a/b[../b[@property='p2'] << . and . >> ../b[@property='p1']]

Ответ 2

Кроме того, этот XPath 1.0:

/a/b[preceding-sibling::b/@property='p1'][following-sibling::b/@property='p2']

Примечание. Не используйте // в качестве первого шага. Всякий раз, когда вы можете заменить оператор and на предикаты, сделайте это.

В XPath 2.0:

/a/b[. >> ../b[@property='p1']][../b[@property='p2'] >> .]

Ответ 3

Вы можете комбинировать тесты в предикате, используя and.