В следующем списке перечислены встроенные в 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. Внутрь шаблона я поместил элемент , и шаблон применяется только в том случае, если выбранный шаблоном контекстный узел в то же время является и текущим узлом в очередной итерации в элементе .
Листинг 8.1. Применение функции current
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.
.
.
|
|
|
|
Результат применения этой таблицы стилей будет точно таким же, как если бы элемента вообще не было, потому что тело элемента применяется только тогда, когда контекстный узел совпадает с текущим узлом.
Функция documentособенно полезна, потому что с ее помощью можно читать несколько документов и обрабатывать их содержимое. Функция documentприменяется следующим образом:
node-set document(uri, base-uri?)
Функция принимает параметр uri, который может представлять собой URI читаемого документа или набор узлов, чьи строковые значения задают идентификаторы URI. Второй, необязательный параметр base-uriпредставляет собой набор узлов, базовый URI которого используется для вычисления всех относительных URI, могущих находиться в параметре uri.
В следующем примере (листинг 8.2) я обрабатываю в процессоре XSLT один документ, planets1.xml, и также считываю и обрабатываю второй документ, planets2.xml. Вот planets1.xml.
Листинг 8.2. planets1.xml
Вот planets2.xml— в элементе содержится одна планета (листинг 8.3).
Листинг 8.3. planets2.xml
Mercury
.0553
58.65
1516
.983
43.4
А вот таблица стилей planets.xml, которую я применяю к planets1.xml. Таблица стилей содержит шаблон, выбирающий элемент в planets1.xml, и в этом шаблоне я считываю planets2.xmlпри помощи и функции document(листинг 8.4).
Листинг 8.4. Применение функции document
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
|
|
|
|
.
.
.
Эта таблица стилей обрабатывает данные в planets1.xmlи также считывает и обрабатывает planets2.xml; вот полный результат — как видите, данные для planets2.xmlдобавились нужным образом:
The Planets Table
The Planets Table
| Name |
Mass |
Radius |
Day |
| Mercury |
.0553 (Earth = 1) |
1516 miles |
58.65 days |
Функция documentудобна, поскольку позволяет считывать на этапе выполнения такие дополнительные документы, как справка о правах владения или отказе от них, фирменный бланк и т.п.
Читать дальше