Смущенный о последствиях предшествующего родного брата и последующего родного брата - PullRequest
1 голос
/ 01 мая 2019

Я запутался в том, что должно быть чем-то простым, и предыдущие вопросы (и документация) на самом деле не помогают.

Скажем, у нас есть эти 6 братьев и сестер:

<a_tag>... a1 ...</a_tag>
<b_tag>... b1 ...</b_tag>
<a_tag>... a2 ...</a_tag>
<b_tag>... b2 ...</b_tag>
<a_tag>... a3 ...</a_tag>
<b_tag>... b3 ...</b_tag>

Некоторые выражения xpath работают так, как я ожидал. Например, //a_tag выбирает все 3 a_tags; //a_tag[2] выбирает только a2.

С помощью //a_tag[following-sibling::b_tag] снова выбираются все 3 a_tags.

Становясь немного любопытнее, //a_tag[following-sibling::b_tag[2]] правильно выбирает a1 и a2. Однако, используя //a_tag[following-sibling::b_tag[3]], выбирается только a1, в то время как я ожидал, что он выберет все 3 a_tags (потому что за ними следуют b_tag[3].

А затем //a_tag[preceding-sibling::b_tag[1]][following-sibling::b_tag[2]] выбирает a2, как и ожидалось, но //a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[3]], который я ожидал выбрать a3, выходит пустым.

Если вы добавите в него что-то, что я бы ничего не выбрал, например //a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[1]], вместо этого выберите a3.

Есть еще такие, но я считаю, что проблема достаточно ясна. Любой свет, брошенный на это, был бы оценен.

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Хорошо, позвольте мне объяснить, как это работает.

//a_tag[following-sibling::b_tag[$n]]

На общем языке это означает получить все a_tag с $ n следующих братьев и сестер . Рассмотрим приведенный ниже пример:

// a_tag [следующий-родственный :: b_tag [1]]

Это говорит, что дай мне все a_tag с 1 b_tag после. Теперь, когда все a_tag в примере имеют 1 b_tag после a_tag с, вы увидите все 3 a_tag выбранные.

Вы увидите только первый a_tag, выбранный при использовании ниже xpath, потому что это единственный тег, который имеет 3 b_tag с после.

// a_tag [следующий-родственный :: b_tag [3]]


Подходит к следующему xpath

* +1032 * // a_tag [предшествующее-родственный :: b_tag [1]] [следующая-родственный :: b_tag [2]]

Если у вас есть несколько условий [] в xpath, оно будет выполняться слева направо, то есть будет выполнено условие левой стороны, а затем применено следующее условие. Итак, значение приведенного выше xpath: поймите меня все a_tag с, которые имеют b_tag с 1 до и 2 после , поэтому a2 является единственным узлом с b1 (1 b_tag) до и b2 and b3 (2 b_tags) после.

//a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[3]] даст вам пустое, потому что у вас нет a_tag, у которого есть 2 b_tag с до и 3 b_tags после.

Теперь вы должны понять, почему //a_tag[preceding-sibling::b_tag[2]][following-sibling::b_tag[1]] выбрано a3.

Надеюсь, я ясен.

1 голос
/ 01 мая 2019

Однако, используя //a_tag[following-sibling::b_tag[3]], выбирается только a1, в то время как я ожидал, что он выберет все 3 a_tags (потому что за ними следует b_tag[3]).

Вот как настроить вашу модель в соответствии с реальным поведением XPath:

  • //a_tag
    • Выбрать все a_tag элементов (как вы упомянули) .
  • //a_tag[following-sibling::b_tag[3]]
    • Из всех выбранных a_tag элементов, выберите только те , у которых есть третий после родного элемента b_tag, , который является только единственным <a_tag>a1</a_tag>, как отмечено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...