T.M. SoftStudio

feci quod potui, faciant meliora potentes

Язык XPath 1.0

Язык XPath основывается на модели XML-документа, описывающей его как иерархическую структуру — XPath-дерево, состоящее из узлов семи типов:

  • корневой узел;

  • узлы элементов;

  • текстовые узлы;

  • узлы атрибутов;

  • узлы пространств имен;

  • узлы инструкций по обработке;

  • узлы комментариев.

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

Основной тип выражений языка XPath — это выражения пути, возвращающие узел или набор узлов, отобранный согласно критериям.

Выражения пути являются основой и могут содержать другие XPath-выражения, определяющие критерии выбора узлов и возвращающие информацию о структуре и свойствах узлов.

Синтаксис выражения пути базируется на последовательности, представляющей адрес узла или набора узлов в дереве. Соответственно такой адрес может быть абсолютным или относительным.

Выражение пути начинается с абсолютного адреса, состоящего из символа / и отправляющего XPath-процессор к корневому узлу. Далее следует относительный адрес, вычисляемый последовательно слева направо, соответственно шагам адресации, из которых относительный адрес состоит.

Каждый шаг адресации отделяется от предыдущего символом / и обеспечивает отбор узлов относительно предыдущего шага (контекста или уровня).

Синтаксис выражения пути бывает двух типов — полный и сокращенный.

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

Оси языка XPath представлены следующим набором:

  • ancestor:: — содержит всех предков текущего контекста;

  • ancestor-or-self:: — содержит текущий контекст и всех его предков;

  • attribute:: — содержит все атрибуты текущего контекста;

  • child:: — содержит множество потомков текущего контекста;

  • descendant:: — содержит полное множество потомков текущего уровня, включая "внуков" (т. е. потомков потомков) и т. д.;

  • descendant-or-self:: — содержит полное множество потомков и текущий контекст;

  • following:: — содержит все узлы документа после текущего контекста, за исключением потомков и узлов атрибутов и пространств имен;

  • following-sibling:: — содержит все узлы-братья после текущего контекста, за исключением узлов атрибутов и пространств имен;

  • namespace:: — содержит все узлы пространств имен текущего контекста;

  • parent:: — содержит предка на один уровень назад;

  • preceding:: — содержит все узлы документа перед текущим контекстом, за исключением предков и узлов атрибутов и пространств имен;

  • preceding-sibling:: — содержит все узлы-братья перед текущим контекстом, за исключением узлов атрибутов и пространств имен;

  • self:: — содержит текущий контекст.

Сокращенный синтаксис шага адресации позволяет сделать следующие замены:

  • attribute:: — можно заменить символом @;

  • child:: — можно опустить;

  • descendant-or-self:: — можно заменить символами //;

  • parent:: — можно заменить двумя точками (..);

  • self:: — можно заменить точкой (.).

В XPath-выражении, после оси, следует условие отбора узлов, представленное типом и названием отбираемых узлов.

Условие отбора может иметь форму QName-имени узла, символа *, означающего выбор всех узлов для данной оси, а также функций node(), text(), comment() и processing-instruction(), означающих выбор любого узла, узлов текста, комментариев и инструкций по обработке соответственно.

После условия отбора в XPath-выражении следуют утверждения, которые уточняют или фильтруют отбор узлов на данном шаге. Утверждения ограничиваются квадратными скобками ([]) и могут состоять из:

  • выражений пути;

  • чисел, определяющих позицию выбираемого узла;

  • выражений, содержащих операторы — арифметические +, -, *, div и mod, логические and и or, объединения |, сравнения =, !=, <, >, <=, >=;

  • функций.

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

Библиотека языка XPath 1.0 состоит из следующих функций:

  • last() — возвращает число узлов контекста или размер контекста;

  • position() — возвращает позицию узла в наборе узлов контекста;

  • count(node-set) — возвращает число узлов в наборе узлов аргумента функции;

  • id(object) — возвращает набор узлов, выбранных по их идентификатору;

  • local-name(node-set?) — возвращает имя узла без пространства имен, первого в наборе узлов аргумента;

  • namespace-uri(node-set?) — возвращает URI пространства имен узла, первого в наборе узлов аргумента;

  • name(node-set?) — возвращает QName-имя узла, первого в наборе узлов аргумента;

  • string(object?) — преобразовывает объект аргумента в строку;

  • concat(string, string, string*) — объединяет строки аргументов;

  • starts-with(string, string) — возвращает true, если вторая строка входит в начало первой, иначе возвращает false;

  • contains(string, string) — возвращает true, если первая строка содержит вторую, иначе возвращает false;

  • substring-before(string, string) — если найдена вторая строка в первой, возвращает подстроку первой строки до первого вхождения второй строки;

  • substring-after(string, string) — если найдена вторая строка в первой, возвращает подстроку первой строки после первого вхождения второй строки;

  • substring(string, number, number?) — возвращает подстроку первого аргумента, начиная с позиции второго аргумента и с количеством символов третьего аргумента;

  • string-length(string?) — возвращает длину строки аргумента;

  • normalize-space(string?) — возвращает нормализованную строку аргумента с убранными пробелами, а так же замененными управляющими символами;

  • translate(string, string, string) — возвращает строку, как результат замены символов строки первого аргумента, которые встречаются в строке второго аргумента, на соответствующие по позиции символам из строки второго аргумента символы из строки третьего аргумента;

  • boolean(object) — преобразует объект аргумента в логическое значение;

  • not(boolean) — возвращает true, если аргумент false;

  • true() — возвращает true;

  • false()– возвращает false;

  • lang(string) — возвращает true, если язык, определяемый аргументом, совпадает с языком, определенным атрибутом xml:lang контекста;

  • number(object?) — преобразует аргумент в число;

  • sum(node-set) — возвращает число как сумму чисел, полученных в результате применения функции number() к каждому узлу набора аргумента;

  • floor(number) — возвращает наибольшее целое число, не большее, чем аргумент;

  • ceiling(number) — возвращает наименьшее целое число, не меньшее, чем аргумент;

  • round(number) — возвращает число как результат округления аргумента.