Объединяя использование предыдущего и следующего собора в одном и том же запросе 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"
. Я могу сделать любой из тех, у кого есть предыдущий брат и ось следующего брата, но я не могу найти, как объединить оба.
Ответы
Ответ 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
.