Расширение XSLT |
Статьи - XSLT | ||||
Мы увидели, как сделать XSLT более похожим на программирование. Как насчет добавления к нему фактического программирования? Давайте взглянем на добавление функциональности Java к таблице стилей XSLT. Во-первых, следует отметить, что хотя механизм расширения является частью рекомендаций XSLT, рассматриваемая здесь реализация специфична для процессора Xalan XSLT. Основные идеи практически одинаковы для других процессоров, однако для уточнения деталей вам придется сверяться с документацией. Далее мы создадим расширение, которое позволит нам масштабировать рецепт на несколько порций. Расширение XSLT производится с помощью различных методик. Первая - это использование элементов extension. Элемент extension – это элемент в пространстве имен, который указывает на класс Java. Взгляните, например, на следующий элемент extension (см. листинг 30).
Мы создали пространство имен, которое соответствует классу comp.backstop.RecipeScaler, который включает в себя статический метод под названием scaleMessage (см. листинг 31).
Добравшись до элемента, процессор видит префикс пространства имен scaler: и знает, что он обозначен как префикс элемента extension, и таким образом понимает, какой класс обозначен в определении пространства имен. Вызываемый им метод отвечает локальному имени элемента - scaleMessage. Сам метод получает два аргумента, из которых мы фактически используем один. Параметр context ссылается на контекст процессора, который позволяет взглянуть на элементы, относящиеся к элементу extension, однако мы просто займемся самим элементом extension. Так как мы получаем этот элемент как параметр метода, мы можем извлечь значения любых атрибутов, добавленных к этому элементу, таких как servings в данном случае. Текст, возвращенный методом, добавляется к выводу на месте элемента extension. Это означает, что если применить таблицу стилей, мы получим результаты, показанные на рисунке 10.
Элементы extension могут быть весьма полезны, хотя и несколько сложны в использовании. Функции extension Еще один способ добавить функциональность при помощи таблиц стилей - это использование функций extension, которые несколько проще реализовывать, чем элементы extension. Например, мы можем создать функцию, которая умножает количество ингредиентов и количество порций (см. листинг 32).
Добавление этой функции в таблицу стилей идентично добавлению элемента extension, в котором уже есть карта пространства имен для класса (см.листинг 33).
Учтите, что вызов функции включает префикс пространства имен. Как и ранее, процессор видит префикс и знает, что надо выполнить вызов класса RecipeScaler. В результате количество ингредиентов умножается на два (см. рисунок 11).
Хотя данный код и работает, поддерживать его сложно. Давайте посмотрим, как упростить поддержку. Программирование XSLT Прежде, чем закончить изложение, рассмотрим два аспекта XSLT, которые предоставляют некоторые возможности, характерные для обычных языков программирования. |