function milesToKilometers(e) {
miles = parseInt(e.text);
return miles * 1.6;
}
]]>
.
.
.
Поскольку пока в Internet Explorer нельзя связать пространство имен с функцией расширения, для их вызова используется специальный элемент Microsoft . Ниже показано, как это выглядит в таблице стилей kilometers.xsl
, где я передаю в функцию milesToKilometers
текущий узел для преобразования миль в километры. Поскольку IE 5.5 и младше не поддерживают правила по умолчанию (хотя версия 6.0, вышедшая одновременно с подписанием этой книги в печать, поддерживает их, и вам не нужно ничего менять), для этих браузеров я предоставил правило для корневого узла (листинг 5.16).
Листинг 5.16. kilometers.xsl
function milesToKilometers(e) {
miles = parseInt(e.text);
return miles * 1.6;
}
]]>
The Planets Table
The Planets Table
|
|
|
|
milesToKilometers(this)
Вот и все, результат этого преобразования приведен на рис. 5.4.
Рис. 5.4.Применение функции расширения в Internet Explorer
Со временем производители будут поставлять все больше и больше функций расширения. Как можно определить, доступна ли заданная функция расширения? Для этого служит функция function-available
.
Применение функции function-available
Функция XSLT 1.0 function-available
служит для проверки доступности функции. В следующем примере я хочу воспользоваться функцией расширения starpowder:calculate
для математических вычислений, а если она недоступна, я отправляю в результирующий документ текст «Sorry, can't do math today.» (Извините, сегодня математические вычисления не работают.), хотя можно, конечно, прекратить обработку и вывести сообщение об ошибке при помощи элемента :
Sorry, can't do math today.
В рабочем проекте XSLT 1.1 для поддержки функций расширения появился новый тип данных — внешний объект (external object). Переменной XSLT, о которой пойдет речь в главе 9, может быть присвоен внешний объект — так же, как и один из четырех типов данных XPath, поддерживаемых в XSLT (строка, число, логическое значение, набор узлов). Внешний объект представляет объект, который создается внешним языком программирования, возвращается функцией расширения и не может быть преобразован в один из четырех типов данных XPath. Тип данных « external object
» был добавлен в XSLT для того, чтобы предоставить вам безопасную «оболочку» для таких данных. Пока еще никто не реализовал поддержку внешних объектов, но это ожидается в скором времени.
Элементы расширения — это элементы, добавленные в XSLT пользователем или производителем. В рабочем проекте XSLT 1.1 для элементов расширения был установлен ряд правил, и в XSLT 2.0 предполагается более широкая их поддержка.
В рабочем проекте XSLT 1.1 правила определяли, что элементами расширения должны быть определенные пользователем или производителем элементы, не являющиеся элементами верхнего уровня. Они должны принадлежать к пространству имен, которое было определено как пространство имен расширений.
Для определения пространства имен расширений применяется атрибут extension-element-prefixes
в элементе , или атрибут xsl:extension-element-prefixes
в элементе буквального результата или элементе расширения.
Ниже приведен пример. Xalan позволяет вам создать несколько выходных документов при помощи своего элемента расширения . Для того чтобы применить этот элемент, я могу добавить в planets.xml
элементу документа атрибут file
, задав имя файла, в который будет отправлен вывод, как redirected.xml
:
Mercury
.0553
58.65
1516
.983
43.4
.
.
.
Теперь в таблице стилей XSLT, которую я назвал redirect.xsl
, я определяю пространство имен « redirect
» так, чтобы оно соответствовало классу Java, который поддерживает ее в Xalan: org.apache.xalan.lib.Redirect
. Я также устанавливаю атрибут extension-element-prefixes
элемента в значение пространства имен « redirect
»:
version="1.0"
xmlns:lxslt=http://xml.apache.org/xslt"
xmlns:redirect="org.apache.xalan.lib.Redirect"
extension-element-prefixes="redirect">
.
.
.
В этот момент мне ничто не мешает применить элемент расширения для записи вывода в новый файл (в отличие от указанного в командной строке). Например, для того, чтобы отправить в другой файл отформатированное содержимое элемента , я могу получить имя создаваемого файла из атрибута file
элемента и записать данные в этот новый файл:
Читать дальше