</book>
<chapter>Text 1</chapter>
<chapter>Text 2</chapter>
<chapter>Text 3</chapter>
Дополнительные возможности по расширению
В XSLT 1.1 был введен элемент xsl:script
, предоставляющий дополнительные возможности для создания и использования функций расширения. При помощи xsl:script
функции расширения могут быть явным образом определены в самом преобразовании.
В процессоре, который поддерживает скриптовые языки типа JavaScript, исходный код функций расширения может включаться в само преобразование, например.
<xsl:stylesheet
version='1.1'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:js='javascript:code'>
<xsl:script language='javascript' implements-prefix='js'>
function iff(arg1, arg2, arg3) {
if (arg1) {
return arg2;
} else {
return arg3;
}
}
</xsl:script>
...
</xsl:stylesheet>
Атрибут implements-prefix
(англ. implements prefix — реализует префикс) связывает определяемую функцию с некоторым пространством имен (как мы отмечали ранее, все функции расширения должны принадлежать ненулевым пространствам имен). При вызове функций из этого пространства имен в XPath-выражениях, процессор будет искать их определения в элементах xsl:script
, которые реализуют соответствующий префикс.
Атрибут language
определяет язык программирования, в котором написано расширение. Очевидно, язык влияет на то, как будет выполняться расширение — например, должен ли процессор интерпретировать содержимое xsl:script
или следует загрузить внешний Java- класс. Естественно, не следует ожидать, что любой процессор сможет выполнять расширения, написанные на произвольных языках программирования — как правило, разработчики XSLT-средств в документации к своим продуктам оговаривают, какие языки расширения они поддерживают. Как следствие, преобразование, использующее расширения, написанные на 'непонятном' процессору языке, либо не будут выполнены вообще, либо будут выполнены некорректно.
Помимо двух обязательных атрибутов implements-prefix
и language
, в элемент xsl:script
могут быть включены атрибуты src
и archive
, которые указывают физическое местоположение кода расширения.
'Внешние' типы данных
Четыре основных типа данных языка XPath (булевый, численный, строковый типы и множества узлов) в первой версии XSLT были расширены типом результирующего фрагмента дерева. В некотором смысле, фрагменты деревьев были 'внешним' типом по отношению к XPath, но, тем не менее, многие из функций базовой библиотеки с успехом с этим типом работали.
В XSLT 1.1 была впервые представлена поддержка произвольных внешних типов данных. Функции расширения могут возвращать и оперировать любыми типами данных. Например, в XSLT-процессорах, написанных на Java, в случае использования расширений в качестве значений часто используются произвольные классы.
Форматирование текущей даты и времени, которое было продемонстрировано в ext:date
, может быть переписано при помощи функций расширения следующим образом.
<xsl:stylesheet
version='1.1'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:Date='java:java.util.Date'
xmlns:SimpleDateFormat='java.text.SimpleDateFormat'>
<xsl:variable name='df' select='SimpleDateFormat:new('HH:mm')'/>
<xsl:variable name='now' select='Date:new()'/>
<xsl:template match='/'>
<xsl:value-of select='SimpleDateFormat:format($df, $now)'/>
</xsl:template>
</xsl:stylesheet>
Пространства имен с префиксами Date
и SimpleDateFormat
определяют привязку к Java-классам java.util.Date
и java.text.SimpleDateFormat
соответственно (в этом примере мы используем формат URI пространств имен, принятый в процессоре Saxon).
Объявление
<xsl:variable name='df' select='SimpleDateFormat:new('HH:mm')'/>
присваивает переменной df
результат выполнения конструктора класса SimpleDateFormat
со строковым параметром 'HH:mm'
, что эквивалентно Java-коду
SimpleDateFormat df = new SimpleDateFormat('НН:mm');
Иными словами, переменной df
был присвоен 'внешний' тип данных java.text.SimpleDateFormat
. Аналогично, переменная now содержит данные типа java.util.Date
. Фактически, этим переменным были присвоены экземпляры соответствующих классов.
Выражение SimpleDateFormat:format($df, $now)
, использованное в этом преобразовании, представляет собой ни что иное, как применение метода format
экземпляра