пятница, 16 января 2009 г.

Очень простой xsl-шаблон для сайта



При поддержке kozhanovan большей частью решил проблему, о которой писал в этом посте. Здесь я опишу, как сделать xml-шаблон сайта самым простоым, какой я могу придумать, способом. Действительно, просто, если знать, какие действия нужно проделать. Да и действий-то — по пальцам пересчитать можно.

Допустим, вы, как я, хотите создать сайт, все страницы которого имеют одинаковое расположение общего заголовка, меню и прочего, и только в одном месте у разных страниц должен стоять разный блок содержания. Допустим также, что вы, как и я, разумно ленивый человек и не желаете вставлять каждую страницу с содержанием в шаблон вручную. Тогда вам надо поручить эту работу кому-то еще. Я обращусь к xml и xsl-преобразование.

Предполагаю, что вы знаете, что работать с html-ем нужно не в ворде, а в редакторе простого текста, вроде блокнота. Есть, впрочем и специальные редакторы для xml, но их я здесь обсуждать не буду.

Приступим.

Во-первых, ваш html должен быть вэлформед (well-formed). Это подразумевает, что каждый открывающий тэг (<my_tag>) должен иметь соответствующий закрывающий (</my_tag>), или быть пустым (<my_tag />). Так же, каждый значение каждого параметра тэга должно быть заключено в кавычки (так можно <img src="a.gif" />, а так нельзя <img src=a.gif />). Даже вольное обращение с комментариями может быть причиной ошибки преобразования.

Далее, из страницы вы выделяете шаблон, в котором на месте будущего содержания вставляете какую-нибудь пометку, чтобы не потеряться. Например так.



><!-- Начало html-шаблона страницы -->

<html>
<head/>
<body>
<h1>Это заголовок,</h1>
<h2>который будет на каждой странице</h2>
<hr width="30%" align="left"/>

<!-- Конец перой части html-шаблона -->

ЗДЕСЬ БУДЕТ КОНТЕНТ!!!

<!-- Вторая часть html-шаблона -->

<hr width="30%" align="left" />
С вопросами заходите сюда: <a href="http://yaguanodont.livejournal.com/">yaguanodont.livejournal.com</a>
</body>
</html>

<!-- Конец html-шаблона -->

Предварительный шаблон


Теперь превратим наш шаблон в xsl протым добавлением вначало, вконец и в середину небольших кусков кода.
><?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">


<!-- Начало html-шаблона страницы -->

<html>
<head/>
<body>
<h1>Это заголовок,</h1>
<h2>который будет на каждой странице</h2>
<hr width="30%" align="left"/>

<!-- Конец перой части html-шаблона -->

<!-- Здесь будет вставлено содержание страницы -->

<xsl:copy-of select="/content/*" />

<!-- Конец содержания страницы -->

<!-- html-шаблон продолжается отсюда -->

<hr width="30%" align="left" />
С вопросами заходите сюда: <a href="http://yaguanodont.livejournal.com/">yaguanodont.livejournal.com</a>
</body>
</html>

<!-- Конец html-шаблона -->

</xsl:template>

</xsl:stylesheet>

simple.xsl


Далее создаем xml-файл содержания страницы. По-хорошему, xml придуман для смысловой разметки документов. То есть нужно не указывать выделение жирным для имени автора книги и курсивом для названия, а создать тэги <author> и <title> и соответствующим образом разметить данные. А уже в xsl-таблице, предназначенной для отображения в интернете, указать, что тэг author соответствует жирному шрифту, а тэг title курсиву. Если предпочтения для отображения изменились, менять придется только xsl. Я упрощаю, конечно.

Это правильно... Но до-олго. Создавать продуманную структуру для простенького сайта мне совершенно не хочется. Так что поступим проще. Оставим разметку содержания html-тэгами, а содержание будет просто копироваться в нужное место шаблона.

Чтобы получить xml, добавим в начала файла две стандартные строки, а дальше заключим все содержание, которое должно войти в страницу, в тэги <content> и </content>.
simple.xml
<?xml version="1.0" encoding="windows-1251" ?>
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>

<content>

<!-- Начало вставляемого содержания страницы -->

<p align="justify">
<font color="darkred" style="font-size: 12pt">

<b>Интересный</b>
<i>типа&#160;текст</i>
<strike>тут</strike>

</font>
</p>

<!-- Конец вставляемого содержания страницы -->
</content>

Вторая строчка там указывает на соответствующий xsl-файл. Это особенно важно, если вы собираетесь поручить xsl-преобразование браузеру.

Далее, вы берете программу, которая выполняет для вас xsl-преобразование, или просто открываете xml-файл в браузере. Вуаля!


Вид simple.html в браузере

Это заголовок,


который будет на каждой странице



Интересный типа текст тут



С вопросами заходите сюда: yaguanodont.livejournal.com


Полученный после преобразования код будет таким:


Исходный код simple.html
<html>
<head>
<META http-equiv="Content-Type" content="text/html">
</head>
<body>
<h1>Это заголовок,</h1>
<h2>который будет на каждой странице</h2>
<hr width="30%" align="left">

<p align="justify">
<font color="darkred" style="font-size: 12pt">
<b>Интересный</b> <i>типа текст</i>
<strike>тут</strike>
</font>
</p>
<hr width="30%" align="left">
С вопросами заходите сюда: <a href="http://yaguanodont.livejournal.com/">yaguanodont.livejournal.com</a></body>
</html>



Как видите, все встало на места. Комментарии, кстати, не сохранились. Это потому, что комментарии в xml выделяются так же как в html.

Зачем я вставил &#160; в xml-файле между "типа" и "текст"? А чтобы не забыть сказать вам, что большинство ссылок на специальные символы, вроде &nbsp; в xml нельзя использовать без дополнительного DTD-описания. Поскольку я хотел сделать пример предельно простым, я обошелся прямым указанием кода символа "неразрывный пробел". Обычно, таких символов много не бывает, так что проблем быть не должно.

На больших шаблонах страниц и содержания я этот метод еще не проверял, но если ваш html вэлформед, думаю, все будет хорошо. Для проверки своих файлов я использую редактор XmlShell. Он может и проверить, и провести преобразование, и при редактировании кое-какие подсказки выдает. Хотя редактирую по-старинке, в Far'е.

Для xsl-преобразования файлов есть еще более простая программа, без редактора, — Xsltprocessor. Ее преимущество — предельная простота. Три поля для выбора xml, xsl и выходного файла и кнопка выполнения.

Обе эти программы могут обрабатывать только один xml-файл за раз. Натравить их сразу на директорию не удается. Кроме того, даже xsl-таблицу для xml-файла придется указывать вручную, хотя путь к ней и указан.

К сожалению так и не удалось найти программу, которая могла бы применить одно и то же xsl-преобразование сразу к папке xml-файлов. Если кто такую знает, буду благодарен за информацию. Например, наткнулся на утилиту xsltproc, которая работает с командной строки. Что-то подобное мне бы подошло, но она под юникс.

* * *


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

Комментариев нет:

Отправить комментарий