Урок 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://www.parser.ru/docs/lang/xdocclass.htm">Класс xdoc</link>
        <link href="
HTTP://www.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://www.parser.ru/docs/xdocclass.htm">Класс xdoc</a></li>
<li><a href="
HTTP://www.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.


Copyright © 1997–2024 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 18.06.2024