ColdFusion разработчики могли использовать XSLT еще до появления CFMX, но для это приходилось вручную устанавливать обработчики и изучать синтаксис трансформации. Сейчас в CFMX встроен обработчик Xalan от Apache (Java версия), что дает поддержку XSLT и упрощает работу с ним.
Функция XMLTransform()
XSLT файл – это XML файл, написанный на языке XSLT. Чтобы произвести трансформацию, мы передаем два пакета XSLT обработчику. Первый – пакет XML данных, а второй – пакет трансформации XSLT. Обработчик исполняет трансформацию и возвращает полученный трансформированный текст (см. Рисунок 1).
Рисунок 1. XSLT в действии.
Как работает XSLT?
XSLT предоставляет простой и расширяемый синтаксис разметки, для трансформации XML в разные текстовые форматы. Он может создать отформатированный результат как HTML или как неразмеченный текст, или трансформировать из одного XML формата в другой XML формат. Он похож на CFML в том, что он объединяет в себе язык разметки и язык команд.
XSLT – основанный на XML язык, поэтому он должен следовать правилам оформления XML. Корневой элемент всегда один и тот же: Номер версии всегда равен 1.0. URL означает, что стили соответствуют правилам XSLT Рекомендации от W3C, которые были опубликованы в ноябре 1999 г. Префикс "xsl" выбран условно, но так принято, что все XSLT документы используют именно его. Все элементы XSLT команд также используют префикс "xsl". Все остальные элементы в файле являются частью результирующей трансформации.Внутри элемента <xsl:stylesheet> присутствует, по крайней мере, один элемент <xsl:template>, который совпадает с одной и более частями XML документа – в следующем примере это корень документа:
Атрибут match использует синтаксис XPath – язык XML выражений, которые следует многим правилам обращения к директориям и файлам ("/" означает корень документа, "." означает значение текущего элемента и т.д.). XPath также поддерживает полный синтаксис запросов, которые позволяют найти определенные части XML документа.Когда XSLT может пригодиться?
По крайней мере, XSLT может быть использован для осуществления таких возможностей форматирования XML, которые не доступны в CFMX XML API. Например, XML документ, созданный в ColdFusion с помощью объектного метода (используя функции XMLNew() и XMLElemNew()) получается в одну строку без каких либо отступов. Такой вид отлично подходит для обработки XML анализатором, но для человеческих глаз трудно воспринимаем. Чтобы исправить это, мы можем создать пользовательскую функцию (UDF) и обработать XML документ с помощью таблицы стилей XSLT:
Эта UDF может быть использована для форматирования любого корректного XML пакета, включая WDDX. Таблица стилей содержит один элемент <xsl:template>, которые соответсвует корню документа: Элемент <xsl:copy-of> копирует содержимое текущего объекта (корня документа) в трансформированный вывод. Сам по себе элемент <xsl:template> выполняет не много работы – он просто возвращает XML документ в первоначальной форме. Основная работа ложится на элемент <xsl:output>, который предшествует элементу <xsl:template>: Атрибут "indent" определяет, что XML должен иметь отступ. В действительности сам по себе он не делает отступ, а указывает на необходимость отступа. Для создания отступа используется атрибут "indent-amount", который не является частью XSLT спецификации, но присутствует как возможность обработчика Xalan. Обратите внимание на использование префикса "xalan", который объявлен в корневом элементе таблицы стилей:xmlns:xalan="http://xml.apache.org/xslt"Элемент <xsl:output> также содержит атрибут "encoding", который контролирует формат кодировки текста.
Трансформирование XML в HTML
XML может быть трансформирован в HTML с помощью таблицы стилей XSLT. Для этого примера мы используем Macromedia Designer/Developer Resource Feed – список доступных статей на сайте Макромедия в разделе DesDev Center и колонки в заранее установленном XML формате.
Чтобы отобразить отформатированное содержимое XML файла на Web странице, мы загрузим XML файл с помощью тега <cfhttp> и XSLT файл с помощью тега <cffile>: Теперь осуществляем трансформацию и выводим результат: Это все, что нам нужно на стороне ColdFusion – файл mmresources.cfm: Основная часть работы происходит с помощью таблицы стилей XSLT – файл mmresources.xsl: Тут есть два элемента <xsl:template>: один для корневого элемента ("macromedia_ resources"), а другой для элемента с данными ("resource"). Корневой <xsl:template> создает основную HTML таблицу и использует элемент <xsl:apply-templates>, чтобы выбрать все ресурсы, у которых атрибут "type" равен слову Article: Второй элемент <xsl:template> соответствует каждому элементу "resource". Он создает ряд в HTML таблице и наполняет его ячейки данными из вложенных элементов: Первый тег <td> содержит тег <a>, with its "href" attribute populated from the current resource element's "url" child element. Фгурные скобки указывают на то, что для считывания данных из XML будет использовано выражение XPath. Элементы <xsl:value-of> также считывают данные с помощью выражений XPath. В результате получаем XML данные в виде HTML:Трансформирование XML в XML
Может так случиться, что нам понадобиться трансформировать XML в XML. XSLT изначально был разработан именно для этого и очень хорошо с этим справляется!
XSLT файл mmresources2wddx.xsl разработан для трансформирования DesDev Resource Feed в WDDX пакет, предоставляя массив структур: Здесь мы использует те же два XSLT шаблона: один для корневого элемента, а другой для элемента с данными. На этот раз корневой элемент <xsl:template> создает основу для пакета массива WDDX: XPath функция count() возвращает количество записей, соответствующих выражению XPath. Обратите внимание, что тип считываемого ресурса находится в переменной "resourcetype". Эта переменная установлена в файле ранее с помощью элемента <xsl:variable>.Второй элемент <xsl:template> трансформирует текущий элемент "resource" в структуру ColdFusion:
Эта трансформация создает WDDX пакет, который может быть опубликован в файл, сохранен в базе данных или превращен в объект JavaScript с помощью тега <CFWDDX>. Код, запускающий эту трансформацию, в файле mmresources2wddx.cfm:Ограничения
Для обработки XSLT в CFMX используется стандартный обработчик Xalan и мы можем делать почти все, что позволяет этот обработчик. Однако, функция XMLTransform() имеет одно серьезное ограничение: нет параметров.
XSLT обработчики (включая Xalan) позволяю передавать им параметры, которые потом будут использованы в XSLT коде. В приведенном выше примере мы фильтровали элементы по значению атрибута type. Нам следовало передать этот параметр обработчику вместо того, чтобы вручную указывать его значение в XSLT файле. В первом выпуске CFMX такой возможности нет. А пока, мы можем передавать параметры в обработчик, используя родной синтаксис Xalan обработчика (или любого другого выбранного вами XSLT обработчика).
© 2002-2005 г. Вадим Пушкарев