У меня есть довольно простая проблема, но я, может казаться, не разрешаю его. Скажем, у меня есть следующий код:
<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"
. Я могу сделать любого из тех, которые имеют предыдущий одноуровневый элемент и ось следовать-одноуровневого-элемента, но я, может казаться, не нахожу, как объединить обоих.
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']]
Вы можете комбинировать тесты в предикате, используя и
.
Также этот 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'] >> .]