Статьи |
Шаблонизация на XSLT. Приемы и примеры
Автор: Александр Календарев, 19 марта 2005
Оригинал статьи: PHPIns!de #9, Декабрь'2004
Страницы: 1 2 3![]() ![]() |
Вместо введения.
Прохаживаясь по страницам нашего форума и отвечая на вопросы я пришел к выводу, что большинство спрашивающих посетителей в основных чертах знают основы применения XSLT преобразования, но на практике сталкиваются с рядом вопросов - а как же это использовать?
Про XSLT-преобразование написано много статей, и мне не хотелось бы повторяться и пересказывать теорию XSLT. В данной статье речь пойдет о некоторых приемах и хитростях XSLT-разработчика. На такое громкое название, как CookBook (книга рецептов), статья не претендует, но парой хитростей я поделюсь. Статья рассчитана на начинающих пользователей XSLT-шаблонизации, знающих хотя бы ее основы.
Начнем с азов.
Получение выходного HTML-кода получается путем преобразования XSLT-процессором входных XML-данных по XSL-шаблону. Соответственно, умение организовать правильный выходной поток, т.е. наш HTML-код, состоит из умения правильно организовать XML-данные и умения правильно писать шаблоны. (Хотелось бы отметить, что использование XSLT-преобразования не ограничивается генерацией только выходного HTML-кода).
Отсюда напрашивается вывод, что, прежде чем искать ошибку в шаблонах, надо проверить сами XML-данные, т.е. их структуру и состав. Проверка организуется двумя способами: либо выводом в лог-файл, либо выводом XML-данных вместо результата XSLT-процессора.
Если мы используем второй способ (вывод в браузер), то, чтобы эти данные опознал браузер как XML поток и представил в удобопонимаемом виде, необходимо выдать заголовок Content-type: text/xml:
<?
...
Header( "Content-type","text/xml");
print( $xml );
?>Необходимо отметить, что когда пишется XSL-шаблон, то это уже не HTML, а XML, и надо руководствоваться правилами валидности XML:
- Каждому открывающему тегу должен соответствовать закрывающий тег. Это в основном касается парности таких тегов, как
<table>,<td>,<tr>. - Если тег представлен без пары (одинарный), то он должен иметь закрывающий слэш. Это в основном касается таких одинарных тегов, как
<br/>и<img/>.
Практически это означает, что нельзя перемешивать теги, должна быть четкая иерархия вложенности. Например, такие конструкции как: <b>bla-bla-bla <i> bla-bla-bla </b> bla-bla-bla</i> валидны в HTML, но недопустимы в XML.
Tекст спецификации XML (версии 1.0) можно найти по адресу: http://citforum.ru/internet/xml/xml1_1/ или http://pyramidin.narod.ru/xml/xml1/index.htm.
Использование включений
Вот уже готово Ваше преобразование, осталось только придать внешний вид сгенерированной странице. Нет проблем, когда страница одна или две. Проблемы появляются, когда их больше десятка и весь сайт надо сделать в едином стиле.
Действительно, не будешь же вносить повторяющиеся части HTML кода в каждый шаблон. В PHP-шаблонизаторах это решалось путем включений:
%include header.tpl
...
// текст шаблона
...
%include footer.tplВ XSLT-преобразованиях есть аналогичный механизм >xsl:include /<.
Имеется файл main.xsl, который содержит «генеральный» шаблон, единый для всех страниц:
<xsl:template match="root">
<HTML>
<BODY>
<div align="center"><b>TABLE OF PRICE </b><br/>
<table border="0" bgcolor="#000080" cellpadding="1" cellspacing="1">
....
<xsl:apply-templates select="item" />
....
</table></div>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>В данном шаблоне есть правило <xsl:apply-templates select="item" />, которое применяется ко всем элементам xml-документа. Данная инструкция, может быть заменена на <xsl:call-template name="item" />.
В нашем преобразовании должна быть инструкция <xsl:include href="main.xsl" /> и, соответственно, шаблонное правило, определенное в «генеральном» шаблоне:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="Windows-1251"/>
<xsl:include href="main1.xsl" />
<xsl:template match="/">
<xsl:apply-templates select="root" />
<!—Вызывает правило, определенное в генеральном шаблоне -->
</xsl:template >
<!—Правила, локальных шаблонов -->
<xsl:template match="item">
<tr bgcolor="#ffffff" align="center">
<td align="left">
<xsl:value-of select="description"/>
</td>
<td align="center">
<xsl:value-of select="price"/>
</td>
</tr>
</xsl:template >
</xsl:stylesheet>Если мы используем в «генеральном» шаблоне инструкцию <xsl:call-template name="item" /> то вместо <xsl:template match="item"> используем именной шаблон: <xsl:template name="item">. В этом случае и технология разработки шаблонов – иная.
В любом случае при использовании «генеральных» шаблонов надо придерживаться строго определенного формата выходных xml-данных.
Например, у меня следующая структура:
<root>
<menu>
<item name=""/>
<! -- пункты динамически сформированного меню -->
...
</menu>
<<action>>
<</action>>
</root>Под <</action>> понимается имя тега, соответствующему экшену в модуле, например, для экшена edit буде тег <edit>. Но разработка структуры - дело сугубо индивидуальное.
В заключение хотелось бы заметить, что при использовании XSLT-процессора sablotron (версия php 4) необходимо определить базовую директорию, где лежат файлы включений, функцией xslt_set_base($xh, $filebase), где переменная $filebase должна содержать полный путь к директории.
|
Страницы: 1 2 3 |
|





