Объединение использования предыдущего и последующего брата в одном запросе xpath - PullRequest
20 голосов
/ 02 августа 2010

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

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

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

Ответы [ 3 ]

19 голосов
/ 02 августа 2010

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']]
7 голосов
/ 02 августа 2010

Также этот 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'] >> .]
0 голосов
/ 02 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...