В этой главе мы изучим доступные вам в XSLT функции — как встроенные в XSLT, так и функции XPath. Вы уже встречались с этими функциями выборочно (например, с
id
, generate-id
, position
, count
и т.д). В этой главе мы рассмотрим их все.
Некоторые функции входят в XSLT, некоторые пришли из XPath. И XSLT, и XPath обновляются до версии 2.0, и в конце главы я приведу список новых, готовящихся к выпуску функций. (Пока что никаких новых функций версии 2.0 еще не опубликовано.)
В XSLT встроены следующие функции:
•
element-available()
;
•
function-available()
;
•
current()
;
•
document()
;
•
key()
;
•
format-number()
;
•
generate-id()
;
•
system-property()
;
•
unparsed-entity-uri()
.
Вы также можете пользоваться многими функциями XPath. Я сгруппирую их по типам данных XPath, с которыми они работают. Существует четыре типа данных: наборы узлов, строки, числа и логические значения. С наборами узлов работают следующие функции XPath:
•
count()
;
•
id()
;
•
last()
;
•
local-name()
;
•
name()
;
•
namespace-uri()
;
•
position()
.
Следующие функции XPath работают со строками:
•
concat()
;
•
contains()
;
•
normalize-space()
;
•
starts-with()
;
•
string()
;
•
string-length()
;
•
substring()
;
•
substring-after()
;
•
substring-before()
;
•
translate()
.
Для работы с числами служат следующие функции XPath:
•
ceiling()
;
•
floor()
;
•
number()
;
•
round()
;
•
sum()
.
И эти функции XPath работают с логическими значениями:
•
boolean()
;
•
false()
;
•
lang()
;
•
not()
;
•
true()
.
В этой главе мы познакомимся с работой всех вышеназванных функций, а начнем с функций, встроенных в XSLT. Не обязательно читать всю главу подряд — скорее ею лучше пользоваться как справочным руководством: здесь перечислены все функции в удобном для просмотра виде.
В следующем списке перечислены встроенные в XSLT функции:
•
current()
. Возвращает текущий (current) узел — но не контекстный узел. Текущий узел — это узел, используемый в данный момент в таких циклах, как
. Функцию current нельзя применять в образцах;
•
document()
. Позволяет считывать несколько документов;
•
element-available()
. Показывает, доступен ли элемент расширения;
•
format-number()
. Форматирует числа при выводе;
•
function-available()
. Показывает, доступна ли функция расширения;
•
generate-id()
. Указывает процессору XSLT присвоить идентификатор узлу и возвратить его. При повторном применении generate-id к тому же узлу функция возвращает присвоенный ранее идентификатор;
•
key()
. Позволяет осуществлять поиск по ключу;
•
system-property()
. Позволяет проверить три системных свойства: xsl:version
(версия XSLT, поддерживаемая процессором XSLT), xsl:vendor
(производитель процессора XSLT) и xsl:vendor-url
(URL производителя процессора XSLT);
•
unparsed-entity-uri()
. Предоставляет доступ к неразобранным сущностям, объявленным в DTD или схеме, через URI.
В следующих разделах все эти функции рассматриваются подробно и с примерами.
Функция
current
возвращает текущий (current) — не контекстный (context) — узел. Контекстный узел шаблона — это узел в выбранном наборе узлов, к которому применяется шаблон. Текущий узел, с другой стороны, это используемый в данный момент узел в таких циклах, как
. Функция возвращает текущий узел как набор узлов с одним узлом:
node-set current()
Обратите внимание:
current
нельзя применять в образцах, поскольку образцы должны быть независимы от пути обработки, а способы реализации таких структур, как циклы, в процессорах XSLT могут различаться.
Следующий пример, в котором я выбираю элементы
при помощи шаблона (листинг 8.1), демонстрирует работу функции current
. Внутрь шаблона я поместил элемент
, и шаблон применяется только в том случае, если выбранный шаблоном контекстный узел в то же время является и текущим узлом в очередной итерации в элементе
.
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.
.
.
Name
Mass
Radius
Day