Язык скриптования сайтов Parser 3

       

но не их форматирование. Подготовкой


Урок 6. Работаем с XML



<?xml version="1.0" encoding="windows-1251" ?>

<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  

Что надо запомнить: что надо купить книжку по XML, XSLT и DOM.

Что делать дальше: читать эту книжку и экспериментировать с примерами из нее, радуясь тому, что на свете есть хорошие стандарты. А также почитать о postprocess, и придумать, как его приспособить, чтобы обращение к XML-файлу вызывало его преобразование в HTML?


Содержание раздела