Урок 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.


In order to add comments you must register.
Copyright © 1997–2017 Art. Lebedev Studio | http://www.artlebedev.ru Дата обновления: 01.08.2005