| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Практический XSLT. Использование в качестве шаблонизатора
Автор: Fade Описанная ниже схема успешно мною используется уже более 3 лет. По началу я к XSLT относился с большой опаской (особенно, когда разбирал чужие исходники), однако однажды поняв, что к чему, уже не представляю, как без него можно работать. Рабочий столОпределим, что нам нужно для работы:
У меня входной XML документ выдает CMS-система, в которой каждая страница с материалом собирается в XML-дерево. К XHTML-макету никаких ограничений нет. Есть лишь определенные рекомендации по верстке, которые позволят значительно сэкономить время на формирование шаблона. В качестве парсера (сборщика) конечного документа можно использовать браузер. Нужно лишь указать в XML-документы путь к файлу шаблону: <?xml-stylesheet type="text/xsl" href="template.xsl" ?>Хотя, как показала практика, этот механизм довольно глючный (мне пришлось пользовать IE). Лучше воспользоваться средствами XML-парсинга языка, на котором написана CMS-система. Я использую Parser (на нем, вообщем-то, у меня вся система и работает). Входной XML-документДля начала разберемся со входным XML-документом. Для того, чтобы использовать XSL нужно иметь полное представление о его структуре.Я использую следующую схему: Обозначенный выше пример схемы не претендует на свою оптимальность. В силу тех или иных причин, мне он удобен. Но, обо всем по порядку. <?xml version="1.0" encoding="windows-1251"?> - заголовок
XML-файла. Должен идти строго с начала файла. В нем прописана версия
используемого XML-языка и кодировка документа. Я как правило работаю в
windows-1251 (пока так удобнее), но, по идее UTF-8
лучше.<document lang="ru" id="0"> - корневой элемент документа (можно
придумать свое имя). Атрибуты:
<lang_table> - таблица языков, используемых на сайте.<navigation> - блок элементов навигации:<sections> - блок основной навигации (основная структура сайта):<item id="0" parent_id="0" is_published="1" section="1"> - элемент
структуры сайта. Атрибуты:
<content> - блок содержимого.В моей CMS используется модульная структура: все наполнение сайта представляет собой модули двух видов:
В XSL-шаблонах есть разметка блоков, в которые можно размещать модули. Для определения блоков я использую простую нумерацию. CMS при сборке страницы просто выводит в все модули, которые задействованы на странице в виде: <item id="1" container="1" sorting="2" type="com"
method="list_news" title="Новости">Атрибуты:
DTD я практически не использую (лишь в самом общем виде): Его можно вставить прямо в XML-документ. Сразу после
<?xml version="1.0" encoding="windows-1251"?>.Подготовка XHML-шаблонаXSL-шаблон создается на базе XHTML-шаблона (некой типовой страницы сайта). Код XHTML-страницы, при этом, должен быть валидным. Рассмотрим по шагам процесс создания шаблона. Проверив валидность XHML-страницы своего шаблона, для облегчения собственной работы, обозначьте в нем положение всех динамических блоков:
Сделать это лучше всего с помощью обычных HTML-комментариев: ... Основы описания XSL-шаблоновВсе файлы XSL-шаблонов имеют следующий вид: <xsl:stylesheet version = `1.0` encoding="UTF-8"?> Где: <xsl:stylesheet version = `1.0` encoding="UTF-8"?> -
определяет тип XML-документа и кодировку. Я использую
UTF-8 (не спрашивайте, почему).<xsl:stylesheet> </xsl:stylesheet> - начало и конец XSL-документа.
<xsl:template match="element"> </xsl:template> - начало и конец
шаблона для элемента element.Шаблоны можно условно разделить на три вида:
Если элементы одного вида могут встречаться в различных частях структуры XML-документа (например, в XML-документе, формируемом системой элемент item используется повсеместно и имеет разное значение), то в шаблоне можно указать "структурный адрес" такого элемента: <xsl:template match="navigation/sections/item"></xsl:template>При этом, порядок применения шаблонов иерархичный, т.е., сначала шаблон применяется к корневому элементу, а затем, к дочерним, т.е. если мы вызвали обработчик для navigation, то для вызова обработчика для navigation/sections/item нам достаточно указать адрес sections/item. Структура папок шаблоновДля того, чтобы хранить на одном сайте несколько модулей необходимо как-то продумать структуру их хранения в папкам. При этом, удобнее разбить шаблоны на модули по нескольким xsl-файлам. Такой подход позволит в дальнейшем повторно их использовать при создании новых шаблонов. В простейшем варианте можно создать каталог xsl и там все складировать. Далее, чтобы внутри этого каталог шаблоны не путались (для каждого шаблона у нас получиться несколько файлов) создадим вложенные каталоги:
Нам для начала потребуется создать каталог xsl/my_template и в нем, файл layout.xsl следующего вида: <?xml version="1.0" encoding="UTF-8"?> Где: <xsl:template match="/node()"> </xsl:template> - шаблон для
элемента /node() (корневого). Вместо /node()
можно указать //document, т.к. он у нас являеться корневым
узлом.Копируем весь XHTML-код внутрь блока <xsl:template
match="/node()"></xsl:template>Этот шаблон будет автоматически применяться ко всему XML-документу. В нашем случае, XSL-преобразование заменит весь XML-код на XHTML-код вашего шаблона. Далее, необходимо в директории XSL создать файл template.xsl (где, template - название вашего шаблона), в котором размещаем следующий код: <?xml version="1.0" encoding="UTF-8"?> Где: <xsl:import href="my_template/layout.xsl"/>Директива импорта внешнего XSL-файла (обрабатываеться XSL-процессором) из указанного файла. Путь к файлу указываем относительный. Создание шаблона для основного навигационного менюНаш предыдущий шаблон не обладает никакой динамикой, т.к. просто заменяет весь выходной XML-документ на код нашего шаблона. Следующий шаг - создание шаблона для меню. Меню навигации сайта строиться на основе его структуры, представленной в XML-документе в следующем виде: <navigation>Текущий раздел определяется по двум параметрам:
Соответственно, для того, чтобы вывести меню сайта необходимо создать шаблон для элементов:
При этом, необходимо учесть, что элементы item могут содержать другие элементы item, в том случае, если у раздела есть подразделы: <item> 1. Создаем в директории xsl/my_template файл navigation.xsl следующего вида:<?xml version="1.0" encoding="UTF-8"?> 2. Вставляем в шаблон код нашего меню из файла layout.xsl:<!-- Глобальное меню навигации -->3. …а на его место в файле layout.xsl вставляем вызов нашего шаблона меню:<!-- меню -->Где: select="navigation/sections" - относительный (относительно текущего) путь-адрес элемента. При этом, будут обработаны все элементы navigation/sections. mode="global_menu" - используем шаблон с режимом global_menu. Это нам нужно на тот случай, если нужно будет выводить еще и сервисное меню, отдельно, или "хлебные крошки", или что-еще другое на основе одной и той же ветки навигации. 4. Плюс, добавим в файл layout.xsl директиву импорта файла шаблона navigation.xsl:<xsl:import href="navigation.xsl"/>5. Далее, создаем в файле navigation.xsl еще один шаблон, для обработки пунктов меню:<!-- Обработка ссылок меню -->Где: <xsl:call-template name="href_attribute"/> - вызов шаблона по
имени. При этом шаблон не имеет привязки к элементу, т.е. вызывается
произвольно. <xsl:value-of select="title"/> - вставка-вывод значения элемента
title текущего элемента. Если в параметре перед именем элемента поставить символ
@ - выводиться будет значения атрибута текущего элемента.6. Немного изменяем шаблон sections:<!-- Глобальное меню навигации -->Где: <xsl:apply-templates select="item" mode="global_menu"/> - обработка
всех элементов item элемента sections. При
этом, элементы item самих элементов item (sections/item/item)
обрабатываться не будут, т.е. выводиться только один уровень меню разделов.Мы вынесли обработку элементов item (пунктов меню) в отдельный шаблон. При этом, в нем мы добавили еще и вызов другого шаблона:
<xsl:call-template name="href_attribute"/>Этот шаблон будет формировать нормальные uri-ссылки для элементов нашего меню. О нем немного позже. 7. Теперь нам необходимо доделать меню,чтобы оно учитывало, какой раздел является текущим. Для этого нам придется добавить условную обработку в наш шаблон элемента item: <!-- Обработка ссылок меню --> Здесь мы сталкиваемся с новой конструкцией: <xsl:choose>…которая, собственно, и задает условную обработку XML-элементов. В качестве параметра мы задаем условие: <xsl:when
test="descendant-or-self::*/@id = /node()/@id">В нашем случае это условие равенства атрибутов ID у корневого элемента (document) и текущего элемента (item), которое и определяет, является ли элемент текущим. Внутри блока <xsl:when></xsl:when> располагается то, что выводиться
в случае выполнения условия. В блоке <xsl:otherwise></xsl:otherwise>
- если условие не выполняется.8. Теперь, разберем шаблон href_attribute:<!-- Обработка адреса ссылок меню -->Здесь мы сталкиваемся с инструкцией xsl:attribute. Она позволяет создавать атрибуты для элементов внутри которого она вызывается. В нашем случае мы вызываем ее из элемента a, соответственно, она создаст для него атрибут href, т.е. адрес. Инструкция <xsl:for-each select="ancestor-or-self::item"> задает
цикл обработки для всех элементов, удовлетворяющих условию. В нашем случае мы
выбираем ancestor-or-self::item - ось элементов от корневого
элемента до текущего по цепочке. В нашем случае это позволяет выбрать для всей
цепочки узлы dir, т.е. построить полный адрес текущего
узла-раздела.Далее, нам необходимо каким-то образом определить, как у нас будут обрабатываться модули содержимого. Но, об этом в следующий раз. Рубрика: XML
Вышел MySQL 5.1.30, первый стабильный рели....
После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:
Подробнее... |
Рубрика: MySQL
| Добавлено: 28.11.2008
Тестирование параллельных программ.
Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
Подробнее... |
Рубрика: Тестирование
| Добавлено: 28.11.2008
Архитектура AMD64 (EM64T).
Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.
Подробнее... |
Рубрика: Архитектура AMD
| Добавлено: 27.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|