Книга: Технология XSLT

"Внешние" типы данных

"Внешние" типы данных

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

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

Пример

Форматирование текущей даты и времени, которое было продемонстрировано в главе 10 элементом ext:date, может быть переписано при помощи функций расширения следующим образом.

Листинг 12.7. Использование внешних типов данных в преобразовании

<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 экземпляра класса SimpleDateFormat, присвоенного переменной df к экземпляру класса Date, присвоенного переменной now. В переводе на Java:

df.format(now);

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

Оглавление книги


Генерация: 0.057. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз