2014-02-17 6 views

ответ

3

Предикат фильтрует, если содержащиеся выражение не верно. [.='#'] проверяет, соответствует ли содержание строки текущего контекста (.) #, поэтому первый шаблон будет возвращать все атрибуты @href для ссылок, например <a href="#">...</a>.

Второй шаблон не содержит логического оператора, и он также не является числовым (поэтому это будет позиционный тест). Это будет оцениваться как дано boolean функции:

Функция: boolean boolean(object)

Булева функция преобразует свой аргумент в булево следующим образом:

  • число истинно, если и только если он не является ни положительным, ни отрицательным. ноль или NaN
  • набор узлов является истинным тогда и только тогда, когда он не пуст
  • строки истинно тогда и только тогда, когда его длина не равна нуль
  • объект типа, кроме четырех основных типов преобразуются в логическое значение таким образом, что зависит от того типа

Здесь у нас есть непустая строка с эффективным логическим значением true, поэтому предикат во втором шаблоне никогда не будет фильтровать что-либо.


Предикат как в //a[@href] с другой стороны, фильтр будет для всех ссылок, содержащих @href атрибута (здесь, мы фильтруем для набора узлов).

+0

Таким образом, первый запрос будет возвращать все атрибуты @href для таких ссылок, как '.. Это, по крайней мере, неверно для XPath 1.0 .. http://3v4l.org/39iRA – hek2mgl

+0

Вы опустили'/@ href' в выражение XPath. Если вы добавите его, чтобы он напоминал запрос из вопроса, он точно выполнит то, что я описал в ответе. –

+0

Позор мне, я пропустил это. Очень хороший ответ! – hek2mgl

Смежные вопросы