Применение XML+XSLT при создании сайта

Как известно, существует множество приемов создания сайта (перечислять не буду, наверняка большинство из них вам известны). Спорить от достоинствах и/или недостатках того или иного метода - неблагодарное занятие, поэтому право выбора всегда остается за конкретным разработчиком, учитывающим кроме личных предпочтений следующие факторы:
  • существование стандартов;
  • наглядность;
  • простота;
  • удобство сопровождения;
  • совместимость данных сайта с разными платформами веб-серверов;
  • наличие документации по использованию;
  • развитость программного обеспечения, поддерживающего выбранную технологию.

Рассматриваемый в данной статье метод с использованием XML и XSLT в той или иной степени соответствует этим требованиям, к тому же в настоящее время является наиболее динамично-развивающимся.

Используя XML+XSLT, можно создать сайт/портал двумя путями (о других я пока не в курсе :). Первый способ заключается в посылке пользовательскому браузеру xml-файла, содержащего контент, и xslt-файла, содержащего правила отображения контента в окне браузера. Полученный xml-файл браузер трансформирует согласно правилам из xslt-файла. Минусы очевидны: пересылается избыточная информация и не все браузеры способны производить это самое преобразование. Втрой способ заключается в преобразовании xml-файла с помощью xslt-файла на стороне веб-сервера с помощью какого-либо программного скрипта и посылке клиентскому браузеру обычного html-файла. Как раз второй метод и будет рассматриваться в данной статье.

Основной принцип заключается в следующем: так называемый контент сайта (статьи, ссылки, структура и т.п.) хранятся в xml-файлах. Известно, что данными удобно управлять, когда данные представляют собой не одну большую кучу, а имеют четкую структуру, т.е. каждому элементу данных сопоставляется тип данных и его место в общей массе. XML как раз на подобные задачи и ориентирован. Оформление сайта (цвета, относительное расположение элементов) храняться в xsl файлах (шаблонах). Функция преобразования оформялет отображение контента согласно правилам шаблона, выдавая готовый html-код.

    Разберем следующий пример. У нас есть некий файл, описывающий два абзаца статьи и их нам надо вывести в основное поле странички. Сначала посмотрим на xml файл, который бы мог описывать нашу статью:

<article>
  <text>
Первый абзац пробной статьи. Примеры существенно упрощены, но отражают суть.
Второй абзац будет содержиать список:
  </text>
  <text list="1">
    <l>первый элемент списка</l>
    <l>второй элемент списка</l>
    <l>третий элемент списка</l>
  </text>
</article>

Стилевая таблица (шаблон), на основе которой будет происходить преобразование основной части странички можно представить в следующем виде:

<?xml version="1.0"?>
<xsl:stylesheet version = '1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="html" indent="no"/> (*) убираем из получаемого результата преобразования "наглядность" в виде лишних пробелов и переводов строк
<xsl:template match="/">
  <xsl:apply-templates select="//text"/>
</xsl:template>
<xsl:template match="text">
  <xsl:choose>
    <xsl:when test="not (./@list)">
      <p> (*) формируем стандартный html-абзац с тэгом <p>
        <xsl:value-of select="text()"/> (*) копируем текстовое содержимое
        <!-- если вместе с разметкой, то <xsl:copy-of select="node()"/> -->
      </p>
    </xsl:when>
    <xsl:when test="./@list='1'"> (*) отлавливаем признак списка
      <ul> (*) формируем html-тэг списка
        <xsl:for-each select="./l"> (*) выбираем все элементы списка, помеченные узлом <l>
          <xsl:element name="li"> (*) формируем html-тэг элемента списка
            <xsl:value-of select="text()"/>
          </xsl:element>
        </xsl:for-each>
      </ul>
    </xsl:when>
  </xsl:choose>
</xsl:template>
</xsl:stylesheet>

В изучении использования XSLT-преобразований вам поможет литература.

Итак, что мы имеем? Мы имеем описание контент статьи и правила отображения статьи в основной части окна. Теперь это все нам надо как-то оформить в полноценную страничку. Для этого используется обычный шаблон в виде описания таблицы на html-языке, центральная ячейка которой заполняется результатом преобразования.

... сначала опишем функцию преобразования. Назовем ее process ...
<?php
function process($xml_m,$xsl_m) {
$arguments = array(
'/_xml' => $xml_m,
'/_xsl' => $xsl_m,
);
$xh = xslt_create();
$result = xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL,$arguments);
if (!$result) die('XSLT processing error: '.xslt_error($xh));
xslt_free($xh);
echo trim($result);
}
?>
... далее следует обычное начало стандартной html странички ...
<html>
<head>
<title>Заголовок сайта</title>
</head>
<body>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<!-- рисуем шапку странички -->
<tr><td width="110" valign="top"><img src="img/logovig.gif" alt="logo" border="0"></a></td>
<td valign="middle" align="center"><!-- сюда обычно втыкают банеры --></td></tr>
<tr>
<td width="110" valign="top"><!-- содержимое левого столбца--></td>
<!-- основное поле -->
<td valign="top">
<?php
//вывод основного контента
process('contetnt.xml','pattern.xml');
?>
</td>
</tr>
<tr>
<!-- левый футер -->
<td width="110"></td>
<!-- середина футера -->
<td valign="top"></td>
</tr>
</table>
</body></html>

В результате вы должны получить табличку, в верхней строке которой имеется какой-то логотип, а в центральной части странички будет два абзаца, причем второй будет состоять из списка неких элементов.

В развитие данного метода, в целях упрощения администрирования сайтом, вы можете вынести структуру сайта в отдельный файл, где у вас будет описано содержание сайта и взаимосвязь между отдельными страничками. Файл со структурой можно использовать для формирования меню, навигации, карты сайта и т.п. Разбив основную html-таблицу на большее количество ячеек, вы можете вставить вызов функции преобразования с соответствующими xml и xsl файлами. Примером может служить этот сайт.

Примечание: В данном примере использовался язык PHP с библиотекой поддержки XML, в миру называемой Sablotron, но вы можете использовать любой другой язык описания веб-страниц с соответствующим расширением, позволяющим работать с XML файлами. Либо использовать язык РНР, но уже с библиотекой поддерживающей DOM-модель XML файлов, тем более, что по результатам тестирования данный метод оказался самым быстрым.

Следующим шагом в освоении данного метода предлагается использование одного файла-шаблона и одного вызова функции преобразования. Как вариант можно использовать следующую методику: xml-файл структуры сайта, xml-файл статьи и другие вспомогательные xml-файлы пред преобразованием "сливаются" в один. Слияние можно произвести либо посредством применения xsl-преобразования либо используя DOM-модель (вариантов масса). Далее, к полученному xml-файлу применяется преобразование основной xsl-таблицы сайта, содержащей полное описание дизайна сайта. Тем самым обеспечится соблюдение принципа "Содержимое отделено от его представления".

Другим вариантом может служить использование уже наработанных по данной тематике проектов. Примером может служить проект DocBook, позволяющий авторам хранить содержимое документов независимо от логической структуры контента. Еще один вариант носит название @X, и служит для "для эффективного управления структурированными данными, их публикацией и обменом с помощью открытых XML-cтандартов".

Конечно, я не раскрыл всех "секретов" и нюансов работы с данным методом. Но иначе было бы не так интересно. В своих поисках вы наверняка найдете много нового и на определенном этапе данная статья покажется вам "записками дилетанта". Так что, вперед и с песней.

P.S. И следите за кодировками :)

Полезные ссылки:

Шапоткин Сергей, источник: http://www.izone.kiev.ua



Опубликовал admin
14 Ноя, Вторник 2006г.



Программирование для чайников.