Какова роль скобок в XPath 1.0? - PullRequest
       10

Какова роль скобок в XPath 1.0?

0 голосов
/ 04 сентября 2018

В Chrome DevTools> Elements при поиске //tr/td/span я нахожу элемент (поскольку такой элемент существует на моей странице).

Когда я ищу (//tr)/td/span или (//tr/td)/span, я также нахожу этот элемент.

Но ни //tr(/td)/span, ни //tr/(td)/span, ни //tr/(td/)span ничего не нашли.

Что означают эти скобки в XPath?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Скобки в XPath используются как и в других языках программирования:

  1. Группировка аргументов функции: например: //tr/td[contains(.,"e")]
  2. Индикация приоритета оценки: Например: группировка нормальных арифметических выражений, а также ведущий группировка путей (трасса LocationPath до PrimaryExpr в грамматике XPath), как в (//td)[1], чтобы найти первый td в документе, а не //td[1], который находит элементы td, которые являются первыми дочерними элементами их соответствующих родительских элементов.

Они также используются в

  1. тестирование узлов : например: node(), element(), ...
  2. инструкции по обработке: например: PageBreak().

В ваших примерах, которые ничего не находят (например, //tr(/td)/span, //tr/(td)/span 1 и т. Д.), Заключены в круглые скобки пути, которые не следуют ни в одной из перечисленных выше категорий. Такое использование скобок на самом деле синтаксически неверно и должно было сообщаться как таковое, а не молчаливо проваливаться.

1 Обратите внимание, что это выражение на самом деле было бы синтетически допустимым в XPath 2.0 / 3.0. Спасибо, @Andersson, что заметили.

0 голосов
/ 04 сентября 2018

Я не думаю, что скобки что-то значат в вашем случае, но они могут быть использованы для возврата требуемого набора узлов / узлов в зависимости от переданного индекса

Например, HTML выглядит следующим образом:

<table>
  <tr>
    <td>
      <span>first</span>
    </td>
    <td>
      <span>second</span>
    </td>
  </tr>
    <tr>
    <td>
      <span>third</span>
    </td>
      <td>
      <span>fourth</span>
    </td>
  </tr>
</table>
  • (//tr)[1]/td вернет ячейки только для первой строки (first, second)

  • (//tr)[2]/td - для второго ряда (third, fourth)

  • (//tr/td)[1] - первая ячейка первого ряда (first). Обратите внимание, что //tr/td[1] возвращает каждую первую ячейку каждой строки (first, third)

    ...

...