Глава 2. Неизменный «Hello, world»

Сначала напомню, что это перевод глав из книги «XSLT» издательсва O'Reilly.
В следующих главах мы потратим много времени на XSLT, XPath и различные продвинутые функции, используемые для преобразования XML-документов. Сначала, несмотря ни на что, мы погрузимся в короткий пример, чтобы проиллюстрировать, как работают преобразования.

2.1. Цели этой главы

К концу этой главы вы будете знать:

  • Как создать основной шаблон
  • Как использовать шаблон для преобразования XML-длкумента
  • Как XSLT-процессор использует шаблон для преобразования документа
  • Структуру XSLT-шаблона

2.2 Преобразование «Hello, world»

Продолжая традицию примера «Hello, world», начатую Брайаном Керниганом (Brian Kernighan) и Денисом Ритчи (Dennis Ritchie) в кгиге «Язык программирования C» (The C Programming Language (Prentice Hall, 1988), мы будем преобразовывать «Hello, world» XML-документ.

2.2.1 Наш пример документа

Сначала мы посмотрим на наш пример документа. Это простой XML-документ, учитывающий XML-спецификацию версии 1.0, включающий в себя знаменитое дружественное приветствие к миру:

<?xml version="1.0"?>
<greeting>
Hello, World!
</greeting>

Что мы бы хотели, так это преобразовать этот обворожительный документ в что-то, что мы могли бы видеть в обычном браузере.

2.2.2 Пример шаблона

Это XSLT-шаблон, который определяет, как преобразовать XML-документ:

<xsl:stylesheet
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   version="1.0">

    <xsl:output method="html"/>

    <xsl:template match="/">
        <xsl:apply-templates select="greeting"/>
    </xsl:template>

    <xsl:template match="greeting">
        <html>
            <body>
                <h1>
                    <xsl:value-of select="."/>
                </h1>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Мы поговорим об этих элементах и том, что они делают через минуту. Имейте в виду, что шаблон сам по себе XML-документ, так что мы должны следовать всем правилам XML-документа, которые мы обсудили в предыдущей главе.

2.2.3 Преобразование XML-документа

Чтобы преобразовать XML-документ, используя XSLT-шаблон, запустите эту команду:

java org.apache.xalan.xslt.Process -in greeting.xml -xsl greeting.xsl -out greeting.html

Эта команда преобразует документ greeting.xml, используя шаблоны, найденные в файле greeting.xsl. Результаты преобразования записываются в файл greeeting.html. Проверьте получившийся файл в вашем любимом браузере, чтобы удостовериться, что преобразование работает верно.

2.2.4 Результаты преобразования

XSLT-процессор свормировал следующие результаты:

<html>
<body>
<h1>
Hello, World!
</h1>
</body>
</html>

После отрисовки в браузере, получившийся документ выглядит так:

Поздравляю! Вы только что использовали XSLT для преобразования XML-документа.

2.3 Как обрабатываются шаблоны

Сейчас пока у нас кружится голова от волнения, потому что мы смогли преобразовать XML-документ, давайте обсудим шаблоны и то, как они работают. Большая часть изучения хитростей XSLT — постигать, как обрабатываются шаблоны. Чтобы было яснее, мы будем продвигаться по шагам, диктуемым шаблоном XSLT-процессору для создания HTML-документа, который мы хотим.

2.3.1 Разбор шаблона

До того как XSLT-процессор сможет обработать ваш шаблон, ему нужно прочесть его. По большому счету не имеет значения, как XSLT-процессор считывает информацию из вашего шаблона. Для наших целей, мы будем только притворяться, что XSLT-процессор может волшебным образом находить всё, что ему нужно, в нашем файле. (Если вам действительно нужно знать, Xalan использует оптимизированную табличную структуру для представления шаблона; другие процессоры могут использовать этот подход или что-то другое.)

Наше преобразование включает три вещи: элемент <xsl:output>, который определяет HTML в качестве выходного формата и два элемента <xsl:template>, которые определяют, как части нашего XML-документа будут преобразованы.

2.3.2 Разбор преобразуемого
Сейчас, чтобы XSLT-процессор обработал шаблон, ему нужно прочесть документ, который предполагается преобразовать. XSLT-процессор строит представление в виде дерева, исходя из XML-кода. Это тот самый вид, который мы имели в виду, когда создавали наш шаблон.

2.3.3 Намылить, прополоскать, повторить

Наконец, мы готовы начать саму работу преобразований XML-документа. XSLT-процессор может определить несколько свойств, основываясь на вашем преобразовании (в первом примере это было определение метода вывода как HTML), тогда он начнёт обработку следующим образом:

  • У меня есть какие-нибудь узлы для обработки? Узлы, предназначающиеся для обработки представлены как контекст (context). Вначале контекстом является корень XML-документа, но он изменяется по ходу преобразования. Мы поговорим о контексте более подробно в следующей главе.

Пока в контексте есть какие-либо узлы, делается следующее:

  • Получаю следующий узел из контекста. Есть ли у меня какой-нибудь шаблон <xsl:template>, чтобы сопоставить с ним? (в нашем примере следующий узел в корневом элементе, представленным в XPath синтаксическим выражением «/».) Шаблон, которые соответствует узлу — это что-то, начинающееся с <xsl:template match="/">.
  • Если один или более шаблонов <xsl:template> подходят, беру нужный и обрабатываю его. (Нужный — это наиболее уточнённый шаблон. Например, <xsl:template match="/html/body/h1/p"> более точен, чем <xsl:template match="p">.) Если подходящих шаблонов нет, XSLT-процессор использует некоторые встроенные правила. Об этом позже.

Заметим, что это рекурсивная модель обработки. Мы обрабатываем текущий узел, находя подходящий шаблон xsl:template для него. Этот шаблон xsl:template может в свою очередь вызывать другие шаблоны xsl:template, которые вызывают следующие. Эта модель вырабатывается привычкой, и пока к ней привыкать.

Если поможет, вы можете думать о корневом элементе (<xsl:template match="/">) как о методе main в C, C++ и Java. Не имеет значения, сколько кода вы написали, всё начинается с main. Также не имеет значения, сколько шаблонов <xsl:template> вы определили в своём преобразовании, всё начинается с <xsl:template match="/">.

2.3.4 Прогулка по нашему примеру

Давайте мысленно возвратимся к нашему примеру и посмотрим, как XSLT-процессор преобразует документ:

  1. XSLT-пеобразование разбирается и превращается в древовидную структуру
  2. XML-документ также разбирается и превращается в древовидную структуру. (Не слишком беспокойтесь о том, на что похожа древовидная структура и как это работает; пока достаточно помнить, что XSLT-процессор знает всё о том, что есть в XML-документе и XSLT-преобразовании.)
  3. XSLT-процессор сейчас на корневом элементе. Это исходный контекст.
  4. Есть шаблон xsl:template, который подходит корню документа:
    <xsl:template match="/">
    <xsl:apply-templates select="greeting"/>
    </xsl:template>
    Один обратный слеш (/) в XPath выражении означает «корень документа».
  5. Сейчас обработка началась снова внутри шаблона xsl:template. Наша единственная инструкция здесь — применить какой-либо шаблон, могущий быть примененным к некоторому элементу greeting в текущем контексте. Текущий контексте в рамках этого шаблона определяется значением атрибута match элемента xsl:template. Это означает, что XSLT-процессор ищет какие-либо элементы greeting и шаблон xsl:template, что применить второй шаблон из нашего преобразования:
    <xsl:template match="greeting">
        <html>
            <body>
                <h1>
                    <xsl:value-of select="."/>
                </h1>
            </body>
         </html>
    </xsl:template>
  6. Сейчас мы в шаблоне xsl:template для элемента greeting. Первые три элемента в этом шаблоне (<html>, <body> и <h1>) — это HTML-элементы. Поскольку они не определены в декларации пространств имён, XSLT-процессор прогоняет эти HTML-элементы через выходной поток неизменными.
  7. В середине нашего шаблона есть элемент xsl:value-of. Этот элемент выводит значение чего-либо в выходной поток. В этом случае, мы использует XPath выражение . (одиночная точка), чтобы определить текущий узел. XSLT-процессор смотрит на текущий узел (элемент greeting, который мы сейчас обрабатываем) и выводит его текст.
    Поскольку наше преобразование — это XML-документ (мы постоянно твердим об этом, так?), мы должны закрыть теги <h1>, <body>, и <html>. На этой стадии мы закончили с этим шаблоном, так что контроль возвращается к шаблону, который вызвал нас.
  8. Сейчас мы вернулись в шаблон для корневого элемента. Мы обработали всё greeting элементы, так что мы закончили с этим шаблоном.
  9. В текущем контексте больше нет никаких элементов (существует только один корневой элемет), так что XSLT-преобразование закончено.


    Tags:
    This entry was posted on Monday, July 13th, 2009 at 3:40 pm and is filed under Первое преобразование, введение. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Reply

Your comment