Тесты узла
После того как с помощью оси определена область поиска, в ней отыскиваются узлы определенных видов или узлы с определенными именами. Для этого применяется тест узла (node test). В соответствии со своими задачами Тесты узла делятся на две группы. Рассмотрим каждую из них подробнее.
Тест по имени узла
Первая разновидность теста — тест по имени узла (name test) — содержит просто уточненное имя типа QName, состоящее из префикса и локального имени, отделенного от префикса двоеточием. Он отбирает узлы по имени, записанному в нем. В тесте можно использовать два шаблона уточненных имен.
Если вместо префикса имени стоит звездочка, например *:section, то отбираются узлы с локальным именем section в любом пространстве имен.
Если вместо локального имени стоит звездочка, например xsd:*, то отбираются узлы с любыми локальными именами, объявленными в указанном пространстве имен.
Тесты no виду узла
Тест no виду узла (kind test) записывается в функциональной форме и может быть одним из следующих:
node () — отбирает узел любого вида;
text () — отбирает текстовые узлы;
comment () — отбирает узлы-комментарии;
element ()— отбирает все узлы-элементы, эквивалентно element(*) и element(*,*);
element (name) — отбирает все узлы-элементы с именем name;
element (name, type) — отбирает узлы-элементы с именем name и типом type, определенным в схеме XSD документа. На месте первого или второго аргумента может стоять звездочка *, означающая "все элементы" или "все типы". Второй аргумент может заканчиваться словом nillable, показывающим, что тип определен в схеме XSD со значением xsi:nil="true";
attribute() — отбирает все узлы-атрибуты; эквивалентно attribute (@*) и attribute(@*,*>;
attribute (@name) — отбирает все узлы-атрибуты с именем name;
attribute (@name, type) — отбирает все узлы-атрибуты с именем name и типом type;
processing-instruction () — отбирает все инструкции по обработке;
processing-instruction (name) — отбирает инструкции по обработке с именем обрабатывающей программы name;
document-node () — отбирает все корневые узлы документа;
document-node (element (args)) — отбирает все корневые узлы документа, содержимое которых состоит в точности из одного вложенного элемента, удовлетворяющего тесту element (args). Тест element() может принимать любую из трех перечисленных выше форм.
Предикаты
После отбора, проведенного осью поиска и тестом узла, из полученной последовательности узлов можно выделить те, которые удовлетворяют весьма сложным условиям, задаваемым в третьей, необязательной части шага поиска — предикате. Предикат записывается в квадратных скобках и представляет собой логическое выражение, значением которого может быть true или false. Например, [а=5], [х<2.6], [а>1 and a<8].
Последовательность узлов, к которой применяется предикат, сортируется в направлении, указанном осью: от начала документа к его концу, или наоборот. Отсортированные узлы нумеруются, начиная с 1, и просматриваются по очереди. Для каждого узла вычисляется предикат. Узлы, для которых значение предиката равно false, отбрасываются.
Номер текущего узла называется его позицией (position) в отсортированной последовательности узлов. Точное значение позиции текущего узла возвращается функцией position(). Поскольку очень часто узел выбирается по своему порядковому номеру, предикат вида
|position()=2]
описывают сокращенно как [2].
Количество узлов в последовательности можно получить функцией last(). Используя ее и применяя указанное сокращение, последний узел можно выделить предикатом [last()], а предпоследний — предикатом [last()-1].
Шаг, направляемый фильтром
Шаг, направляемый фильтром, использует вместо оси и теста узла первичное выражение (primary expression):
Первичное выражение[Предикат]
Первичное выражение выдает в качестве результата последовательность узлов и/или атомарных значений, которая затем фильтруется предикатом.
Первичное выражение — это:
число типа xs:integer, xs: decimal, xs: double;
строка символов типа xs: string;
значение переменной, начинающееся со знака доллара $;.
вызов функции;
наконец, произвольное выражение, заключенное в скобки.
Поэтому на шаге, направляемом фильтром, можно применять любое выражение, надо только заключить его в скобки.
Настало время познакомиться подробнее с выражениями языка XPath.
Достарыңызбен бөлісу: |