parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

:) высылаю

egr 10.09.2002 12:27

<?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/xdocclass.htm">Класс xdoc</link> 
        <link href="http://parser.ru/docs/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] 
]