Xslt для чего нужен
Практический XSLT. Использование в качестве шаблонизатора
В сети доступно масса документации по языку XSL. Данный раздел не претендует на роль документации по языку, а лишь кратко, по шагам объясняет, как создать свой XSLT-шаблон.
Описанная ниже схема успешно мною используется уже более 3 лет. По началу я к XSLT относился с большой опаской (особенно, когда разбирал чужие исходники), однако однажды поняв, что к чему, уже не представляю, как без него можно работать.
Рабочий стол
К XHTML-макету никаких ограничений нет. Есть лишь определенные рекомендации по верстке, которые позволят значительно сэкономить время на формирование шаблона.
В качестве парсера (сборщика) конечного документа можно использовать браузер. Нужно лишь указать в XML-документы путь к файлу шаблону:
Хотя, как показала практика, этот механизм довольно глючный (мне пришлось пользовать IE). Лучше воспользоваться средствами XML-парсинга языка, на котором написана CMS-система. Я использую Parser (на нем, вообщем-то, у меня вся система и работает).
Входной XML-документ
Для начала разберемся со входным XML-документом. Для того, чтобы использовать XSL нужно иметь полное представление о его структуре.
Я использую следующую схему:
Обозначенный выше пример схемы не претендует на свою оптимальность. В силу тех или иных причин, мне он удобен. Но, обо всем по порядку.
— заголовок XML-файла. Должен идти строго с начала файла. В нем прописана версия используемого XML-языка и кодировка документа. Я как правило работаю в windows-1251 (пока так удобнее), но, по идее UTF-8 лучше.
Подготовка XHML-шаблона
XSL-шаблон создается на базе XHTML-шаблона (некой типовой страницы сайта). Код XHTML-страницы, при этом, должен быть валидным.
Рассмотрим по шагам процесс создания шаблона.
Администрирование сайта
Основы описания XSL-шаблонов
Все файлы XSL-шаблонов имеют следующий вид:
данные шаблона
Структура папок шаблонов
Для того, чтобы хранить на одном сайте несколько модулей необходимо как-то продумать структуру их хранения в папкам. При этом, удобнее разбить шаблоны на модули по нескольким xsl-файлам. Такой подход позволит в дальнейшем повторно их использовать при создании новых шаблонов.
В простейшем варианте можно создать каталог xsl и там все складировать.
Где:
— шаблон для элемента /node() (корневого). Вместо /node() можно указать //document, т.к. он у нас являеться корневым узлом.
Копируем весь XHTML-код внутрь блока
Этот шаблон будет автоматически применяться ко всему XML-документу. В нашем случае, XSL-преобразование заменит весь XML-код на XHTML-код вашего шаблона.
Где:
Директива импорта внешнего XSL-файла (обрабатываеться XSL-процессором) из указанного файла. Путь к файлу указываем относительный.
Создание шаблона для основного навигационного меню
Наш предыдущий шаблон не обладает никакой динамикой, т.к. просто заменяет весь выходной XML-документ на код нашего шаблона.
Меню навигации сайта строиться на основе его структуры, представленной в XML-документе в следующем виде:
Начало
/
1. Создаем в директории xsl/my_template файл navigation.xsl следующего вида:
2. Вставляем в шаблон код нашего меню из файла layout.xsl:
3. …а на его место в файле layout.xsl вставляем вызов нашего шаблона меню:
4. Плюс, добавим в файл layout.xsl директиву импорта файла шаблона navigation.xsl:
5. Далее, создаем в файле navigation.xsl еще один шаблон, для обработки пунктов меню:
Где:
— вызов шаблона по имени. При этом шаблон не имеет привязки к элементу, т.е. вызывается произвольно.
6. Немного изменяем шаблон sections:
Где:
— обработка всех элементов item элемента sections. При этом, элементы item самих элементов item (sections/item/item) обрабатываться не будут, т.е. выводиться только один уровень меню разделов.
Мы вынесли обработку элементов item (пунктов меню) в отдельный шаблон. При этом, в нем мы добавили еще и вызов другого шаблона:
Этот шаблон будет формировать нормальные uri-ссылки для элементов нашего меню. О нем немного позже.
7. Теперь нам необходимо доделать меню,
чтобы оно учитывало, какой раздел является текущим. Для этого нам придется добавить условную обработку в наш шаблон элемента item:
Здесь мы сталкиваемся с новой конструкцией:
…которая, собственно, и задает условную обработку XML-элементов. В качестве параметра мы задаем условие:
В нашем случае это условие равенства атрибутов ID у корневого элемента (document) и текущего элемента (item), которое и определяет, является ли элемент текущим.
8. Теперь, разберем шаблон href_attribute:
Здесь мы сталкиваемся с инструкцией xsl:attribute. Она позволяет создавать атрибуты для элементов внутри которого она вызывается. В нашем случае мы вызываем ее из элемента a, соответственно, она создаст для него атрибут href, т.е. адрес.
Далее, нам необходимо каким-то образом определить, как у нас будут обрабатываться модули содержимого. Но, об этом в следующий раз.
UPD:
Материалы к статье. Собрал из того, что было:
parser.proc.ru/iso/xslt-1.zip
В шаблоне все пути прописаны от корня (делал на основе шаблона работающего на реальном сайте) поэтому либо перепишите их на относительные либо запускайте из под Apache.
Производительный и читабельный XSLT: сборник советов
В моей практике чаще всего в качестве шаблонизатора используется именно XSLT. Я не буду рассуждать о том, почему так происходит — о преимуществах данной технологии написано вполне достаточно. Но ещё больше написано о её недостатках. Считается, что XSLT является слишком многословным и тяжёлым для чтения, а также не самым производительным. В этой статье я постараюсь собрать несколько советов по улучшению качества XSLT-кода с точки зрения читабельности и выразительности. Некоторые из них также позволят XSLT работать несколько быстрее.
Именованные шаблоны
Многие «проблемы» XSLT связаны с тем, что мы слишком часто пытаемся писать на нём в процедурном стиле. Мы постоянно пытаемся сделать из него Smarty, но упираемся в один простой факт — XSLT является декларативным языком, как бы необычно это для нас не выглядело.
Например, мы пытаемся использовать именованные шаблоны, воспринимая их как процедуры, выводящие данные в определённом формате:
xsl:template name =»CreateItemLink» >
xsl:param name =»item» />
a href =»/item/?id=<$item/id>» >
xsl:value-of select =»$item/name» />
a > br />
xsl:template >
Наверное, многие программисты именно так написали свой первый шаблон. И он неплохо решает свою задачу. Декларативный XSLT предлагает немного другой подход:
xsl:template match =»item» >
a href =»/item/?id=» >
xsl:value-of select =»name» />
a > br />
xsl:template >
Разница совсем не велика. Дело вкуса и стиля программирования. Давайте посмотрим, как шаблон будет использоваться в дальнейшем.
Xsl:for-each и xsl:apply-templates
«Императивную» версию нашего шаблона мы бы стали использовать примерно так:
xsl:template match =»/» >
h1 > My market h1 >
xsl:for-each select =»/root/market/item» >
xsl:call-template name =»CreateItemLink» >
xsl:with-param name =»item» select =».» />
xsl:call-template >
xsl:for-each >
xsl:template >
А «декларативную» — так:
xsl:template match =»/» >
h1 > My market h1 >
xsl:apply-templates select =»/root/market/item» />
xsl:template >
Xsl:Choose
Xsl:choose, пожалуй, одна из самых многословных конструкций в XSLT. Очень часто она используется примерно так:
xsl:template match =»product» >
.
xsl:choose >
xsl:when test =»currencyCode = ‘eur'» >
xsl:value-of select =»‘Euros'» />
xsl:when >
xsl:when test =»currencyCode = ‘usd'» >
xsl:value-of select =»‘Dollars'» />
xsl:when >
xsl:when test =»currencyCode = ‘cad'» >
xsl:value-of select =»‘Canadian dollars'» />
xsl:when >
.
xsl:choose >
.
xsl:template >
Бывают случаи, когда её использовать просто необходимо. Но в данном примере, гораздо правильнее использовать внешний документ со словарём:
Обратиться к нему из шаблона можно с помощью функции document() и XPath:
xsl:variable name =»currencies»
select =»document(‘cur.xml’)/currencies» />
xsl:template match =»product» >
.
xsl:value-of select =»$currencies/currency[code=currencyCode]/name» />
.
xsl:template >
Мне кажется, что такой код гораздо легче поддерживать и он является идеологически более правильным — данные должны оставаться данными, а не превращаться в код, который сложно прочесть.
Встроенные преобразования
Многие не знают, что в XSLT есть несколько «встроенных» преобразований, которые делают за программиста часть работы. Эти преобразования делаются на уровне XSLT-процессора, т.ч. в некоторых реализациях могут работать значительно производительнее «ручных».
Например, за счёт встроенных преобразований осуществляется рекурсивное применение шаблона к потомкам текущего узла. Это равносильно такому шаблону:
xsl:template match =»*|/» >
xsl:apply-templates />
xsl:template >
Причём, если в apply-templates используется mode, то дочерние узлы тоже будут преобразовываться с этим mode. Другой пример, это автоматический вывод текстовых узлов и атрибутов:
xsl:template match =»text()|@*» >
xsl:value-of select =».» />
xsl:template >
Это значит, что вместо
xsl:template match =»name» >
name > xsl:value-of select =».» /> name >
xsl:template >
xsl:template match =»name» >
name > xsl:apply-templates /> name >
xsl:template >
Это (возможно) будет работать быстрее и точно сделает наши шаблоны более гибкими и расширяемыми.
Раздел в стандарте.
Функция concat()
Больше всего при чтении шаблонов меня раздражает подобный код:
Вообще в XPath есть много встроенных функции, которые можно использовать для упрощения кода. Неплохую документацию с примерами можно найти здесь. Особенно стоит обратить внимание на substring(), translate() и т.п. Эти функции не стоит реализовывать на PHP или другом внешнем языке — XSLT-процессор всё равно сделает это лучше.
Используем xsl:element по назначению
Xsl:element нужен исключительно в случаях, когда название элемента определяется динамически.
Во всех остальных случаях, можно писать сразу сами теги. Иначе, код становится слишком многословным безо всякой цели.
XSLT первый шаг
1. Введение
Важные ссылки по теме, первоисточники:
Переводы на русский язык:
Для лучшего понимания всего происходящего я рекомендую читать спецификации в следующем порядке:
Особо пытливые могут также уделить внимание расширенному языку стилей XSL.
2. Валидный XHTML
Что такое валидный XHTML? В первую очередь, это XML-документ, который должен соответствовать спецификации XML. Во-вторую, почти обычная HTML-страница, к которой все привыкли.
Почему нужен именно XHTML? Исключительно из соображений совместимости и кросс-браузерности. Страница в XHTML будет с большей вероятностью отображаться корректно в популярных браузерах, чем обычный HTML.
Для рядового клепателя страниц словосочетание XML-документ должно означать следующее:
Также сам XHTML обязывает выполнять следующие условия:
Пример простого документа XHTML1.0:
И так обо всём по порядку.
Объявление XML-документа, в котором указывается его версия и кодировка.
Для большей безопасности кодировку нужно всегда выставлять, иначе могут возникнуть проблемы с невалидными (по отношению к дефолтной кодировке) символами.
Объявление типа документа и его схемы.
Объявление пространства имён и используемого языка.
Очень важно указывать ссылку именно в таком регистре и никак иначе. Это связано с тем, что в XML имена элементов и содержимое их атрибутов регистрозависимы.
Три версии XHTML1.0 предназначены для лучшей обратной совместимости:
Помимо XHTML1.0 на данный момент доступен XHTML1.1:
XHTML1.1 по сути является тем же XHTML1.0 Strict и призван вытеснить другие версии XHTML1.0. Однако, по сравнению с XHTML1.0 Strict, у него есть ряд отличий:
Итак, если вам нужна наибольшая кросс-браузерность и совместимость с рекомендациями W3C, то XHTML1.1 самое оно!
Из этих соображений результатом моих преобразований будет именно XHTML1.1.
3. XSLT-преобразования
Что такое XSLT? Это язык преобразований XML-документа, который был разработан как часть расширенного языка стилей (XSL).
Зачем нужен XSLT? Он позволяет реализовать схему, при которой данные хранятся отдельно, а их представление отдельно. То есть, один XML-документ преобразуется с помощью другого XML-документа (XSL, в котором находятся XSLT-шаблоны) в конечный документ. Результатом может быть XML, HTML или текстовый документ любого формата.
Для того, чтобы воспользоваться XSLT-преобразованиями, в первую очередь нужно сформировать правильный стиль XSL и подключить его к XML-файлу.
Валидным XSL-документом является XML-документ, у которого задано пространство имён xsl и присутствует корневой элемент stylesheet. В самом простом случае стиль может выглядеть, например, так:
Этот стиль не содержит каких-либо явных определений шаблонов или других элементов XSL. Однако, его уже можно использовать. Чтобы посмотреть результат, достаточно сформировать произвольный XML-документ и подключить к нему этот стиль:
За подключение стиля отвечает строка:
Если файлы text.xml и test.xsl созданы и находятся в одной папке, то с помощью любого XSLT-парсера можно преобразовать исходный test.xml в результирующий документ. В качестве парсера могут выступать все популярные браузеры (IE5+, FF2+, Opera9+ и другие), а также модули в языках программирования, например, в PHP. Если вы используете браузер, то достаточно открыть test.xml, и он сразу отобразит примерно такой результат:
При этом кодировка результата будет UTF-8, несмотря на то, что исходный документ был сформирован в windows-1251. К сожалению, браузеры обычно не позволяют просмотреть код результирующего документа, но модуль XSLT в PHP5 даёт возможность передать результирующий код в переменную, которую можно сохранить в файл. Поэтому, используя PHP, я приведу исходный код результирующего документа:
Этот код не является валидным XML-документом и тем более XHTML1.1. Для того, чтобы сформировать нужный код, я усложню исходный XSL-стиль и добавлю туда необходимые шаблоны и преобразования. При этом исходный XML-документ останется без изменений.
В качестве примера я приведу XSL-стиль, который при помощи XSLT будет выводить список атрибутов исходного XML-документа с их значениями, при этом будет формироваться валидный XHTML1.1. Итак, стиль:
Чтобы понять, как он работает, я распишу каждое действие отдельно:
Документ сформирован в кодировке windows-1251, о чём сообщается в атрибуте encoding. Версию XML-документа желательно всегда указывать, это рекомендация W3C.
Затем идёт объявление корневого элемента, стиля:
Следующим шагом в корневом элементе stylesheet объявляется, каким образом нужно формировать результирующий документ:
Объявление основного шаблона:
Именно этот XSLT-шаблон соответствует корню исходного дерева и будет вызван первым для преобразования. Атрибут match принимает значения, которые должны соответствовать языку поиска элементов XPath.
Остальные шаблоны, если таковые имеются, должны подключаться из этого шаблона при помощи средств XSLT.
Атрибут xmlns= «http://www.w3.org/1999/xhtml» указывает на пространство имён xhtml, которое будет применено по умолчанию к этому элементу и всем дочерним элементам, у которых оно не задано явно.
Атрибут xml:lang= «ru» указывает на язык, в котором сформирована страница (будущая).
Эта часть стиля была нужна для формирования атрибутики валидного XHTML1.1 кода.
Теперь что касается XSLT-преобразований:
Вставка простого текста:
Текст «Мой список:» будет подставлен в тег
Организация цикла по выборке:
Атрибут select принимает выражение XPath, на основе которого делает выборку. Если выборка вернула список узлов, то начинает работать цикл по каждому элементу.
В данном случае выборка вернёт список атрибутов для этого (корневого) и всех дочерних элементов.
В данном случае проверяется на чётность позиция элемента в списке выборки. Если тест возвращает true (порядковый номер элемента чётный), то срабатывает содержимое этого элемента.
Управление атрибутами вышестоящего элемента:
Вывод значений элемента:
Этот код подставит в вышестоящий элемент строку, собранную из имени текущего элемента и его значения. Содержимое атрибута select соответствует XPath.
Вывод ссылки на разработчика парсера XSLT:
Этот небольшой код XSLT формирует ссылку на разработчика парсера XSLT. Во многих случаях она будет разная и содержать разные значения.
Результатом обработки этого стиля ( test.xsl ) станет такой код:
Этот код соответствует стандарту XHTML1.1 и был сформирован на основе исходного XML-документа. Для проверки можно воспользоваться валидатором от W3C, который расположен по адресу http://validator.w3.org/.
В браузере этот код выглядит примерно так:
IE 6 | FireFox 3 | Opera 9.02 |
---|---|---|
4. Приложение
Ссылки на исходный код
Постоянный адрес статьи //anton-pribora.ru/articles/xml/xslt-first-step/. /Автор: Прибора Антон Николаевич, 2009 год/
Использование PHP5 для обработки XSLT
Для получения результирующего документа при помощи PHP5 я использовал такой код:
Дополнительную информацию по использованию XSLT в PHP5 можно найти по адресу http://ru2.php.net/manual/ru/book.xslt.php.
Мысли вслух
«Товарищи, мы стоим на краю огромной пропасти! И я предлагаю сделать большой, решительный шаг вперёд!»
© 2021 Антон Прибора. При копировании материалов с сайта, пожалуйста, указывайте ссылку на источник.
Области применения XSLT
Области применения XSLT
В отличие от языка XML, предметную область XSLT задать очень легко. XSLT следует применять там, где необходимо преобразование одного документа в другой.
Естественно, XSLT имеет также и некоторые ограничения:
? XSLT не подходит для описания преобразований с очень сложной логикой;
? XSLT не подходит для преобразований, которые требуют сложных вычислений.
Первое ограничение связано с тем, что преобразование в XSLT — это всего лишь набор элементарных правил. В подавляющем большинстве случаев этого достаточно для описания преобразования, однако, встречаются также и такие задачи, для которых данного набора правил будет недостаточно. Например, древовидные структуры могут описывать математические выражения, но при этом преобразование для упрощения или вычисления этого дерева выражений может быть чересчур сложным для XSLT.
Второе ограничение является следствием простоты языка XPath, который используется в XSLT для вычислений. XPath предоставляет только самые простейшие вычислительные конструкции, которых явно недостаточно для сложных задач. Кроме того, функциональный стиль XSLT и отсутствие изменяемых переменных делают очень затруднительными многошаговые и циклические вычисления.
Оба этих ограничения можно с успехом обойти при помощи механизма расширений, который позволяет комбинировать XSLT с другими языками программирования. Умело используя расширения, можно совместить гибкость XSLT и мощь традиционных языков.
Ниже мы опишем наиболее классические области применения XSLT: Web-решения, использование в клиент-серверных приложениях и проекты интеграции.
Читайте также
Пример применения мьютекса
Пример применения мьютекса Модернизируем наш пример из раздела, посвященного использованию семафора для случая множества потоков источников и приемников данных. Проблема заключается в том, что когда несколько потоков одновременно попытаются вызвать функцию push() или
Теорема Тевенина и ее применения
Теорема Тевенина и ее применения Что представляет собой теорема Тевенина, и почему она так важна и так широко применяется? Если вы рассчитываете нетривиальные цепи и при этом хотите получить результат при различных нагрузочных сопротивлениях, то идеальным методом
Области применения. NET
Области применения. NET Как и было заявлено Microsoft с самого начала обнародования сведений о. NET, этот набор технологий в первую очередь адресован программистам, которые работают с веб-приложениями, и предназначен для создания расширяемых распределенных приложений, которые,
16.3. Область применения
16.3. Область применения Как один из вариантов грамотного применения перенаправления ввода/вывода, можно назвать разбор и «сшивание» вывода от команд (см. Пример 11-6). Это позволяет создавать файлы отчетов и журналов регистрации
Отличия XSLT 1.1 от XSLT 1.0
Отличия XSLT 1.1 от XSLT 1.0 Отсутствие result tree fragment Главное и наиболее существенное отличие XSLT 1.1 от XSLT 1.0 состоит в том, что тип данных, известный в XSLT 1.0 как result tree fragment (результирующий фрагмент дерева) в XSLT 1.1. отсутствует. Вместо него в версии 1.1 используется множество узлов,
Отличия XSLT 2.0 от XSLT 1.1
Отличия XSLT 2.0 от XSLT 1.1 Прежде чем приступить к описанию отличий второй версии XSLT от версии 1.1 (и, соответственно, 1.0), следует сделать одно существенное замечание. Лицензионные соглашения Консорциума W3 не позволяют раскрывать широкой общественности внутренние материалы
15.1. Правила применения кавычек
15.1. Правила применения кавычек Рассмотрим некоторые основные правила использования кавычек. Излагаемый материал будет сопровождаться большим количеством примеров. Вопросы использования кавычек обсуждаются и в следующих двух частях книги.Некоторые пользователи не
1 Область применения
1 Область применения Настоящий стандарт применяется для пакетов программ. Например, для текстовых процессоров, электронных таблиц, программ баз данных, графических пакетов, программ, реализующих технические и научные функции, и для сервисных программ (утилит).Стандарт
1 ОБЛАСТЬ ПРИМЕНЕНИЯ
1 ОБЛАСТЬ ПРИМЕНЕНИЯ Настоящий стандарт определяет шесть характеристик, которые с минимальным дублированием описывают качество программного обеспечения. Данные характеристики образуют основу для дальнейшего уточнения и описания качества программного обеспечения.
1 ОБЛАСТЬ ПРИМЕНЕНИЯ
1 ОБЛАСТЬ ПРИМЕНЕНИЯ Данный стандарт представляет собой руководство по документированию программного обеспечения для тех руководителей, которые отвечают за производство программного обеспечения или программной продукции. Руководство предназначено для помощи
Область применения проекта
Область применения проекта Этот раздел описывает общие параметры проекта, включая время, необходимое для проектирования, количество потенциальных пользователей и основные приложения, поддерживаемые PKI. На основании этой информации поставщик может подготовить более
Применение языка преобразований XSLT
Язык преобразований XSLT
А это как раз то, что нужно для генерации кода. Применение XSLT может существенно помочь в генерации кода. Кроме того, он предоставляет удобную альтернативу технологии шаблонов Т4.
XSLT был разработан консорциумом W3C (World Wide Web Consortium). Первая версия языка XSLT 1.0 стала рекомендацией 16 ноября 1999 года, а версия XSLT 2.0 стала рекомендацией 23 января 2007 года. Обе версии используются достаточно активно, и в этой лекции мы рассмотрим ту базовую функциональность, которая является для них общей. А это значит, что рассматривать будем в основном первую версию. Также упомянем некоторые команды из второй версии.
Как работает XSLT
Модель XSLT включает в себя такие части как:
Документы XML являются входными данными, которые нужно преобразовать в другие документы. Документ стиля XSLT является корректным (well formed) документом XML и содержит набор правил для выполнения преобразования. Иными словами, документ стиля является шаблоном.
XPath
Применение XSLT
Для преобразования документа XML необходимо добавить в начало документа инструкцию, подобную следующей:
Файл стилей будет применяться следующий:
Инструкция xsl :value-of служит для вычисления выражения, записанного в атрибуте select с последующим выводом результата в том месте, где расположен сам элемент.
Фильтрация
Мы рассмотрели случай, когда считываются значения каждого узла. Однако часто возникает необходимость выбирать только часть данных, то есть их надо фильтровать. Шаблоны XSLT поддерживают два способа фильтрации.
Посмотрим на результат:
Языки высокого уровня:
Как видим, значение «Assembler» не отображается в списке языков, то есть процессор XSLT отфильтровал данные согласно заданным условиям.
Сортировка
Получается такой результат.
Языки высокого уровня:
Названия языков отсортированы в алфавитном порядке и значение «Assembler» не отображается в списке.
Вложенные шаблоны
В сложных случаях возникает необходимость применения вложенных друг в друга шаблонов. Рассмотрим документ, в котором содержатся таблицы и их поля вместе с названиями.
При открытии сгенерированного результата в браузере будет показано следующее: