Основным языком реализации расширений, приводимых в этой главе, будет Java. Пожалуй, Java является единственным языком, интерфейсы расширений для которого достаточно стандартизированы, чтобы можно было говорить об общих подходах. Однако, если читатель не знаком с этим языком — ничего страшного, ведь основное внимание в этой главе уделяется использованию расширений в XSLT, а не написанию их в других языках и Java-код приводится только для того, чтобы сделать примеры рабочими.
Функции расширения
Прежде чем описывать использование функций расширения, вспомним, как мы вызывали
в преобразованиях обычные функции, например, функцию
concat
:
<xsl:value-of select="concat('para', 'bellum')"/>
Атрибут
select
содержит XPath-выражение
concat('para', 'bellum')
, которое с точки зрения синтаксиса XPath является вызовом функции и соответствует продукции
FunctionCall
:
[XP16] FunctionCall ::= FunctionName
'(' ( Argument ( ',' Argument ) * ) ? ')'
Аргументами функции являются выражения, а имя может быть любым корректным XML-именем (за исключением
node
,
comment
,
processing-instruction
и
text
, которые используются для проверки типа узла):
[XP17] Argument ::= Expr
[XP35] FunctionName ::= QName - NodeType
В плане синтаксиса функции расширения ничем не отличаются от стандартных функций: они отвечают тем же самым грамматическим правилам. Единственное различие состоит в том, что функции стандартных библиотек XPath и XSLT принадлежат нулевому пространству имен, в то время как пространство имен функций расширения должно обязательным образом быть ненулевым. Иными словами, вызовы функций, имеющие вид
имя(аргумент, аргумент, ...)
, будут считаться вызовами функций базовых библиотек, а вызовы вида
префикс:имя(аргумент, аргумент, ...)
будут считаться вызовами функций расширения.
Пример
Выражение
round(0.6)
является вызовом функции базовой библиотеки XPath, в то время как выражение
math:round(0.6)
является вызовом функции расширения.
Практически во всех процессорах пространство имен функции расширения является звеном, которое связывает ее с конкретной реализацией.
, которое является вызовом функции расширения. Само имя функции состоит из локальной части round и префикса
math
, которому соответствует URI
java:java.lang.Math
. В большинстве XSLT-процессоров вызов такого рода будет означать обращение к статической функции
round
класса
java.lang.Math
.
Простейшим случаем использования расширений в XSLT-процессорах,
написанных на Java, является обращение к стандартным функциям пакетов Java.
Пример
Предположим, что входящий документ описывает координаты множества точек, а преобразование создает SVG-документ, содержащий линии, которые их последовательно соединяют.
Примечание
SVG — это XML-язык для описания масштабируемой векторной графики (от англ. scalable vector graphics). SVG позволяет простым XML-синтаксисом описывать векторную графику. SVG-документы могут показываться в браузерах при помощи таких компонент, как Adobe SVG Viewer или Batik от Apache XML Project.