Один не очень приятный на вид способ сделать то, что вы, похоже, намереваетесь сделать следующим образом (обратите внимание, что он основан на предположении, что у вас действительно есть несколько <div>
с одним и тем же id
!):
/*/div[@id='foo'][n]/following-sibling::div[@style='padding…']
[
count(preceding-sibling::div[@id='foo'])
=
count(/*/div[@id='foo'][n]/preceding-sibling::div[@id='foo']) + 1
]
Первая строка выражения XPath принимает любого <div style="padding…">
, который является следующим братом n'th <div id="foo">
(это все, что вы получили самостоятельно, выбрав all из них ).
Затем он подсчитывает предшествующего брата <div id="foo">
для каждого из них и сопоставляет только те, которые имеют правильное число здесь, например, на один <div id="foo">
больше, чем соответствующий <div id="foo">
. Измените число n, чтобы выбрать другой набор.
Если на самом деле ваш ввод не имеет несколько элементов с одним и тем же идентификатором, он становится намного проще:
//div[@style='padding…'][preceding-sibling::div[@id][1]/@id = 'foo']
Это выбирает те <div style="padding…">
, где первый предшествующий <div>
(имеющий идентификатор) имеет значение идентификатора 'foo'
. Как указано, это означает, что существует только один <div>
с идентификатором 'foo'
, и что другие предшествующие <div>
s делают не имеют идентификатор.