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

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

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

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

20
задан Abel 7 September 2015 в 20:34
поделиться

3 ответа

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']]
19
ответ дан 30 November 2019 в 00:55
поделиться

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

-1
ответ дан 30 November 2019 в 00:55
поделиться

Также этот XPath 1.0:

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

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

В XPath 2.0:

/a/b[. >> ../b[@property='p1']][../b[@property='p2'] >> .]
7
ответ дан 30 November 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: