но не их форматирование. Подготовкой
Урок 6. Работаем с XML |
<article>
<author id="1" />
<title>Урок 6. Работаем с XML</title>
<body>
<para>Представьте, что вам позволено придумывать любые теги
с любыми атрибутами. То есть вы сами можете определять,
что означает тот или иной выдуманный вами тег или атрибут.</para>
<para>Такой код будет содержать данные, …</para>
</body>
<links>
<link href="http://parser.ru/docs/lang/xdocclass.htm">Класс xdoc</link>
<link href="http://parser.ru/docs/lang/xnodeclass.htm">Класс xnode</link>
</links>
</article>
… но не их форматирование. Подготовкой данных может заняться один человек, а форматированием другой. Им достаточно договориться об используемых тегах и можно приступать к работе… одновременно.
Идея эта не нова, существовали многочисленные библиотеки обработки шаблонов, а многие создавали собственные. Библиотеки были несовместимы между собой, зависели от используемых средств скриптования, порождая разобщенность разработчиков и необходимость тратить силы на изучение очередной библиотеки вместо того, чтобы заняться делом.
Однако прогресс не стоит на месте, и сейчас мы имеем не зависящие от средства скриптования стандарты XML и XSLT, позволяющие нам реализовать то, что мы только что представляли.
А также стандарты DOM и XPath, открывающие для нас еще больше возможностей.
Parser полностью поддерживает все эти стандарты.
Сейчас откройте выбранную вами вчера в книжном магазине книгу, описывающую XML и XSLT. Используйте ее как справочник.
Посмотрим, как можно приведенную статью преобразовать из XML в HTML.
Запишем текст из начала статьи в файл article.xml
И создадим файл article.xsl, в котором определим выдуманные нами теги:
<?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="article">
<html>
<head><title><xsl:value-of select="title" /></title></head>
<body><xsl:apply-templates select="body | links" /></body>
</html>
</xsl:template>
<xsl:template match="body">
<xsl:apply-templates select="para" />
</xsl:template>
<xsl:template match="links">
Ссылки по теме:
<ul>
<xsl:for-each select="link">
<li><xsl:apply-templates select="." /></li>
</xsl:for-each>
</ul>
</xsl:template>
<xsl:template match="para">
<p><xsl:value-of select="." /></p>
</xsl:template>
<xsl:template match="link">
<a href="{@href}"><xsl:value-of select="." /></a>
</xsl:template>
</xsl:stylesheet>
Данные и шаблон преобразования готовы. Создаем article.html, в который заносим следующий код:
# входной xdoc документ
$sourceDoc[^xdoc::load[article.xml]]
# преобразование xdoc документа шаблоном article.xsl
$transformedDoc[^sourceDoc.transform[article.xsl]]
# выдача результата в HTML виде
^transformedDoc.string[
$.method[html]
]
Первой строкой мы загружаем XML-файл, получая в sourceDoc его DOM-представление.
Конструкция похожа на загрузку таблицы, помните ^table::load[…]? Только в этот раз мы загружаем не таблицу (получая объект класса table), а XML-документ (получаем объект класса xdoc).
Второй строкой мы преобразуем входной документ по шаблону article.xsl.
Из входного документа получаем выходной, применяя XSLT преобразование, описанное в шаблоне.
Последней строкой мы выдаем пользователю текст выходного документа в HTML формате (параметр method со значением html).
Здесь можно задать все параметры, допустимые для тега <xsl:output … />.
Рекомендуем также задать параметр "без отступов" (параметр indent со значением no: $.indent[no]), чтобы избежать известной проблемы с пустым местом перед </td>.
Обратившись теперь к этой странице, пользователь получит результат преобразования:
<html>
<head><title>Урок 6. Работаем с XML</title></head>
<body>
<p>Представьте, что вам позволено придумывать любые теги
с любыми атрибутами. То есть вы сами можете определять,
что означает тот или иной выдуманный вами тег или атрибут.
</p>
<p>Такой код будет содержать данные, …
</p>
Ссылки по теме:
<ul>
<li><a href="http://parser.ru/docs/xdocclass.htm">Класс xdoc</a></li>
<li><a href="http://parser.ru/docs/xnodeclass.htm">Класс xnode</a></li>
</ul>
</body>
</html>
Как вы заметили, тег <author … /> никак не был определен, как следствие, информация об авторе статьи не появилась в выходном HTML. Со временем, когда вы решите где и как будете хранить и показывать данные об авторах, достаточно будет дополнить шаблон - исправлять данные статей не потребуется.
Внимание: если вы не хотите, чтобы пользователи вашего сервера имели доступ к .xml и .xsl файлам, храните эти файлы вне веб-пространства (^xdoc::create[/../directory_outside_of_web_space/article.xml]), или запретите к ним доступ средствами веб-сервера (пример запрета доступа к .p файлам здесь: «Установка Parser на веб-сервер Apache. CGI скрипт»).
Подведем итоги шестого урока.
Что мы сделали: создали заготовку для публикации информации в XML формате с последующим XSLT преобразованием в HTML.
Что узнали:
· | класс xdoc |
· | как загружать XML, делать XSLT преобразования, выводить объекты класса xdoc в виде HTML |
Что делать дальше: читать эту книжку и экспериментировать с примерами из нее, радуясь тому, что на свете есть хорошие стандарты. А также почитать о postprocess, и придумать, как его приспособить, чтобы обращение к XML-файлу вызывало его преобразование в HTML?