Объединение использования предшествующего и последующего одноуровневого элемента в одном и том же запросе XPath до первого экземпляра - PullRequest
0 голосов
/ 16 ноября 2018

После публикации здесь Объединение использования предыдущего и последующего брата в одном запросе xpath Я хочу сделать то же самое, за исключением того, что я хочу получить узлы до первого вхождения из р2.

Таким образом, измененные данные примера:

<a>
    <b property="p1">zyx</b>
    <b>wvu</b>
    <b>tsr</b>
    <b>dcv</b> 
    <b property="p2">qpo</b>
    <b>qcs</b>
    <b property="p2">wee</b>
    <b>tbg</b>
    <b>rty</b>
    <b property="p2">qwe</b>
    <b>jkl</b>
</a>

Я попытался

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

, который дает мне dcv, qcs и rty.Затем я попытался

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

, который дает мне wvu, tsr, dcv, qpo, qcs, wee, tbg и rty.

Что мне действительно нужно, так это от p1 до первого p2 илиwvu, tsr и dcv.Я перепробовал почти все комбинации [1], но потерпел неудачу и хотел бы получить некоторую помощь по конструкции.

1 Ответ

0 голосов
/ 16 ноября 2018

Одним из способов достижения этого является использование следующего выражения XPath-1.0:

/a/b[preceding-sibling::b/@property='p1' and not(preceding-sibling::b/@property='p2' or @property='p2')]

Он проверяет, имеет ли данный элемент b предшествующий брат с именем p1 и не является ли предшествующий брат из p2 или p2. Вот и все.

...