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

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

Прежде, чем разбирать функции, рассмотрим синтаксис их вызова. Он описывается правилом FunctionCall:

[XP16] FunctionCall ::= FunctionName

                        '(' ( Argument ( ',' Argument )* )? ')'

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

тип1 функция(тип2, тип3, тип4?)

где тип1 — тип возвращаемого значения, тип2, тип3, тип4 — типы передаваемых параметров, символ '?' обозначает аргумент, который может быть опущен. Также может быть использован символ * для обозначения аргумента, который может повторяться несколько раз. Например,

string concat(string, string, string*)

определяет функцию concat, которая возвращает строку, а на вход принимает два или более строковых параметра.

Аргументы функции отвечают EBNF-продукции Argument:

[XP17] Argument ::= Expr

Имя функции определяется синтаксическим правилом FunctionName. Функция может иметь любое корректное с точки зрения XML имя, кроме названий типов узлов (comment, processing-instruction, text и node):

[XP35] FunctionName ::= QName - NodeType

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

Булевые функции

Функция boolean

boolean boolean(object)

Функция boolean явным образом преобразует объект, который ей передается в булевый тип в соответствии с правилами, изложенными в главе 'Типы данных XPath'. Напомним вкратце эти правила.

□ Число преобразуется в 'ложь', если оно является положительным или отрицательным нулем или не-числом (NaN). В противном случае число будет преобразовано в 'истину'.

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

□ Множество узлов преобразуется в 'ложь', если оно пусто. Непустое множество узлов преобразуется в 'истину'.

□ Объекты других типов преобразуются в булевые значения по собственным правилам. Например, результирующий фрагмент дерева всегда преобразуется в 'истину'.

Примеры:

boolean(2-2) false

boolean(number('two')) false

boolean(-1) true

boolean(1 div 0) true

boolean(-1 div (1 div 0)) false

boolean(-1 div (-1 div 0)) false

boolean(-1 div (-1 div 0) +1) true

boolean('') false

boolean('true') true

boolean('false') true

boolean(/) true

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

boolean(/self::node()) true

Это выражение также обратится в true, поскольку корневой узел соответствует тесту node().

boolean(/self::text()) false

Это выражение обратится в false, поскольку корневой узел не является текстовым узлом.

Функция not

boolean not(boolean)

Функция not выполняет логическое отрицание. Если аргументом была 'истина', not возвращает 'ложь', если аргумент был 'ложью', not вернет 'истину'. Если функции был передан аргумент не булевого типа (например, число), то он сначала будет сконвертирован в тип boolean.

Примеры:

not(false) true

not(true) false

not('false') false

not('true') false

not(0) true

not(/) false

Функции true и false

boolean true()

boolean false()

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату