Продолжается подписка на наши издания! Вы не забыли подписаться?

Назад

XSL

Из того, что никто не может изобрести броузер, отображающий всё, что взбредет в голову разработчику, вытекает необходимость возложить создание интерпретатора (или хотя бы инструкций для некого общего интерпретатора) на разработчика же. То есть, сам написал – сам и читай. Так и возник XSL – Extensible Stylesheet Language, позволяющий привести XML к виду, не только доступному для понимания броузером, но и не оскорбляющему человеческий глаз общей корявостью. XSLT (XSL Transformations) – это развитие XSL, впрочем, различия между ними не принципиальны.

XSLT (его принято именовать списком стилей, style sheet – но к привычным любому Web-разработчику стилевым листам (CSS) он не имеет ни малейшего отношения, а названия XSL/XSLT являются простым недоразумением) содержит набор шаблонов, применяемых к элементам документа и создающих желаемую выходную структуру, и определяет данные исходного документа, к которым применяются эти шаблоны. Такая модель слияния данных и шаблона называется моделью, управляемой шаблоном (template-driven model), и лучше всего работает с однообразными повторяющимися данными. Эта модель должна быть знакома разработчикам ASP, вставляющим куски скриптов в HTML-шаблон для управления обработкой и генерацией данных.

Но XSLT предоставляет и возможности работы с крайне неоднородными данными, типичными для документов. Определяются фрагменты шаблона, и процессор XSLT объединяет результат работы этих фрагментов в конечное дерево, основанное на виде исходных данных. В каждом фрагменте шаблона объявляются тип и контекст исходных узлов, для которых предназначен этот фрагмент, что позволяет процессору XSLT сопоставлять исходные узлы с фрагментами шаблона. Такая модель известна, как модель, управляемая данными (data-driven model), так как именно вид данных управляет видом конечного результата.

Обе модели можно использовать в одном шаблоне, что делает XSLT применимым в широчайшем круге XML-приложений.

Говоря проще, содержимое конечного документа зависит как от содержимого исходного документа, так и от применяемых шаблонов.

Создание HTML-шаблона

Как мы уже говорили, XSL позволяет превратить один XML в другой. Но, поскольку HTML – это один из частных случаев XML, одно из типичных применений XSLT – создание HTML-представления XML-данных. HTML гораздо больше прощает разработчику, чем XML, поэтому не всякий HTML-документ является корректным с точки зрения XML. Но средствами XML нетрудно добиться полного соответствия результирующего документа синтаксису HTML. Рассмотрим следующий пример.

<?xml version="1.0"?>
<portfolio xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <stock exchange="nyse">
    <name>zacx corp</name>
    <symbol>ZCXM</symbol>
    <price dt:dt="number">28.875</price>
  </stock>
  <stock exchange="nasdaq">
    <name>zaffymat inc</name>
    <symbol>ZFFX</symbol>
    <price dt:dt="number">92.250</price>
  </stock>
  <stock exchange="nasdaq">
    <name>zysmergy inc</name>
    <symbol>ZYSZ</symbol>
    <price dt:dt="number">20.313</price>
  </stock>
</portfolio>

Это пример документа с однообразными повторяющимися данными — структура элемента stock повторяется несколько раз с одними и теми же дочерними элементами. Фондовая информация из этого примера будет выведена в виде таблицы, где каждая биржа представляет строку, а столбцы содержат название, символ и цену акции. Для начала создадим HTML-шаблон, выводящий такую таблицу.

<HTML>
  <BODY>
    <TABLE BORDER="2">
      <TR>
        <TD>Symbol</TD>
        <TD>Name</TD>
        <TD>Price</TD>
      </TR>
      <!-- повторяем следующие строки для каждой акции -->
      <TR>
        <TD><!-- место для символа --></TD>
        <TD><!-- место для имени --></TD>
        <TD><!-- место для цены --></TD>
      </TR>
    </TABLE>
  </BODY>
</HTML>

Чтобы заполнить эту таблицу данными из XML-файла, можно, конечно, вручную (например, через ASP) заменить комментарии данными из XML-файла, но для этой работы, собственно, и предназначен XSLT. Элементы из пространства имен XSLT используются для поиска данных в XML-файле и вставки их в HTML-шаблон.

<HTML>
  <BODY>
    <TABLE BORDER="2">
      <TR>
        <TD>Symbol</TD>
        <TD>Name</TD>
        <TD>Price</TD>
      </TR>
      <xsl:for-each select="portfolio/stock">
        <TR>
          <TD><xsl:value-of select="symbol"/></TD>
          <TD><xsl:value-of select="name"/></TD>
          <TD><xsl:value-of select="price"/></TD>
        </TR>
      </xsl:for-each>
    </TABLE>
  </BODY>
</HTML>

Элемент <xsl:for-each> находит в XML-данных набор элементов (элементы "stock" внутри элементов "portfolio") и применяет к каждому из них часть шаблона. В этом примере три элемента stock, поэтому создано будет три строки.

Атрибут select описывает, как найти набор элементов в исходном документе. Синтаксис этого атрибута зовется образцом (pattern), и подробнее о нем и ему подобных можно прочитать в разделе, посвященном XPath.

Внутри элемента <xsl:for-each> вы можете перебрать по очереди дочерние элементы каждого элемента "stock". Элемент <xsl:value-of> выбирает отдельный дочерний элемент и затем вставляет в шаблон его текстовое содержимое.

Теперь можно превратить предыдущий шаблон в настоящий XSLT-шаблон, поместив его в XML и заключив в элементы <xsl:stylesheet>.

<?xml version='1.0' encoding='windows-1251'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <HTML>
      <BODY>
        <TABLE BORDER="2">
          <TR>
            <TD>Symbol</TD>
            <TD>Name</TD>
            <TD>Price</TD>
          </TR>
          <xsl:for-each select="portfolio/stock">
            <TR>
              <TD><xsl:value-of select="symbol"/></TD>
              <TD><xsl:value-of select="name"/></TD>
              <TD><xsl:value-of select="price"/></TD>
            </TR>
          </xsl:for-each>
        </TABLE>
      </BODY>
    </HTML>
  </xsl:template>
</xsl:stylesheet>

Поскольку этот шаблон сам является XML-файлом, он начинается с XML-декларации. Элемент <xsl:stylesheet> означает, что этот документ является шаблоном, и сообщает место объявления пространства имен XSLT. Microsoft Internet Explorer 5.0 поддерживает URL пространства имен XSL http://www.w3.org/TR/WD-xsl. Текущая версия MSXML поддерживает как http://www.w3.org/TR/WD-xsl, так и пространство имен XSLT с URL http://www.w3.org/1999/ XSL/Transform. Американцам, конечно, все равно, но нам с вами придется в обязательном порядке ввести в определение XML что-нибудь вроде "encoding='windows-1251'". Желающие могут ввести KOI-8 или что угодно другое – но сделать это нужно во избежание получения абракадабры в конечном результате.

Чтобы превращение произошло, необходимо заставить кого-нибудь выполнить соответствующие заклинания. В XML-файл можно добавить инструкции, показывающие, какой шаблон нужно использовать. Имя шаблона из предыдущего примера – "stock.xsl", стало быть, нужно вписать <?xml-stylesheet type="text/xsl" href="stock.xsl"?> сразу за <?xml version="1.0"?>. Это приведет к автоматическому преобразованию файла при его открытии броузером. Другим способом применения XSLT-шаблона является использование DOM, например, с помощью MSXML. Подробнее об этом сказано в разделе, посвященном DOM. На сегодня второй способ выглядит несколько более жизнеспособным, так как не все броузеры умеют работать с XSLT, а программную обработку можно встроить в скрипты на сервере.

Конечный результат работы XSLT будет выглядеть так:

<HTML>
  <BODY>
    <TABLE BORDER="2">
      <TR>
        <TD>Symbol</TD>
        <TD>Name</TD>
        <TD>Price</TD>
      </TR>
      <TR>
        <TD>ZCXM</TD>
        <TD>zacx corp</TD>
        <TD>28.875</TD>
      </TR>
      <TR>
        <TD>ZFFX</TD>
        <TD>zaffymat inc</TD>
        <TD>92.250</TD>
      </TR>
      <TR>
        <TD>ZYSZ</TD>
        <TD>zysmergy inc</TD>
        <TD>20.313</TD>
      </TR>
    </TABLE>
  </BODY>
</HTML>

До сих пор мы говорили в основном об управляемой шаблоном модели преобразований. Для простой гомогенной структуры больше ничего и не нужно. То есть, эта модель идеально подходит, если понятно, что должно получиться на выходе.

А как быть, если этого нельзя знать заранее? Как говорилось выше, XSLT имеет механизмы для управляемых данными преобразований, которые формируют результат из фрагментов шаблона, основываясь на структуре обрабатываемого документа. Это особенно важно для XML, представляющего собой сложные структуры данных или документы. Если известно, какие типы элементов могут встретиться в исходном XML, но не их порядок, старшинство и взаимоотношения, придется использовать именно такую модель.

Это звучит сложно, но большинство документов оказываются именно такими.

<...>

**Полностью статью можно найти в печатной версии журнала

Далее


Copyright © 1994-2016 ООО "К-Пресс"