Поделиться через


Предикаты

Предикат — это выражение языка XPath, фильтрующее набор узлов относительно оси и создающее новый набор узлов. Процесс фильтрации включает в себя последовательное вычисление предиката для каждого узла в наборе. Каждый раз, когда предикат вычисляется для узла, происходит следующее:

  • Контекстным узлом является узел, для которого предикат вычисляется в данный момент.

  • Размер контекста представляет собой число узлов в наборе, для которого вычисляется предикат.

  • Позиция контекста представляет собой положение контекстного узла в наборе узлов.

Этот последний контекст, положения контекстного узла в наборе узлов, является относительным и зависит от направления, в котором ось, заданная в шаге определения расположения данных, обходит дерево документа. Обычно ось обходит дерево в прямом или обратном направлении.

  • Ось, направленная вперед — это ось, содержащая контекстный узел или узлы, расположенные после контекстного узла. Оси child::, descendant::, descendant-or-self::, following:: и following-sibling:: представляют собой оси, направленные вперед. Эти оси, направленные вперед, нумеруют узлы набора в порядке их появления в документе, начиная с первого, которому присваивается номер 1.

  • Ось, направленная назад — это ось, содержащая контекстный узел или узлы, расположенные до контекстного узла. Оси ancestor::, ancestor-or-self::, preceding:: и preceding-sibling:: представляют собой оси, направленные назад. Эти оси, направленные назад, нумеруют узлы набора в порядке, обратном порядку их появления в документе, начиная с первого узла, которому присваивается номер 1.

Остальные оси, self:: и parent::, возвращают один узел. Таким образом, для этих двух осей понятие направленности не имеет смысла. Для осей attribute:: и namespaces:: порядок не задан; следовательно, они тоже не являются ни осями, направленными вперед, ни осями, направленными назад.

Выбор узлов

Вычисление выражения предиката дает численное или логическое значение.

Если результатом вычисления предиката является число, язык XPath сравнивает это число с позицией контекста контекстного узла. Если номер и позиция совпадают (то есть контекстный узел находится в соответствующей позиции дерева), результатом вычисления предиката является значение true, и контекстный узел включается в новый набор узлов. В противном случае узел контекста исключается из нового набора узлов.

Если результат вычисления предиката не является числом, язык XPath использует функцию boolean для преобразования этого значения в значение логического типа. Например, предикат [genre='Computer'] даст набор узлов. Если у контекстного узла есть дочерний элемент <genre> с содержимым Computer, результатом вычисления предиката будет значение true, и контекстный узел будет включен в новый набор узлов. В противном случае узел контекста исключается из нового набора узлов.

ms256205.note(ru-ru,VS.100).gifПримечание
Числовой предикат [x] является эквивалентом логическому предикату [position()=x].

См. также

Справочник

Шаги доступа
Оси
Проверки узлов