Главная · Карта сайта · Поиск · Статьи · Компьютерные курсы · Обучающие программы · Открытые проекты · Веб-программирование · Создание интернет-сайта · Полезные ссылки · Глоссарий · Контакты · Декабрь 06 2016 22:51:19
Последнее опубликованное

Что такое Model-View-Controller
Pattern Model-View-Controller

Как создать свой веб-сайт
Как создать свой сайт в интернете

Разное
Статистика

Язык трансформации XSL


Что такое XSL трансформация

Спецификация XSL (eXtensible Stylesheet Language) – еще один набор рекомендаций от W3C, который на этот раз представляет собой язык описания трансформации или набора преобразований данных XML документов в другие форматы. Трансформация осуществляется из одного XML формата в другой, например из документа XML, соответствующего вашей прикладной схеме в формат XML документа Microsoft Office или просто в XHTML. Возможно, также, преобразование не в расширение XML, а в любой другой структурированный формат, к примеру, в HTML (стандарты HTML и XHTML сильно похожи, но только внешне) или же просто в произвольное текстовое представление.

Слово stylesheet в названии стандарта заставляет многих проводить аналогию с другим инструментом форматирования языков разметки - CSS (Cascading Style Sheets) – каскадными таблицами стилей. Оба эти стандарты имеют из общего, скорее всего только это самое слово в названии. С использованием XSL можно добиться эффекта применения CSS, но CSS ни разу не аналог XSL. Вот их принципиальные отличия:

  • CSS оказывает влияние только на стиль представления данных HTML/XHTML, в то время, как XSL может легко изменить само их содержание.
  • CSS применяется на стороне клиента интернет браузером, а XSL может быть применен как на стороне клиента, так и на стороне сервера.
  • XSL является расширением XML, а CSS – отдельный формальный язык.

Стандарт XSL, в контексте преобразований XML в HTML, ближе по своему назначению к PHP (Hypertext Preprocessor) – скриптовому языку веб-программирования, применяемому на стороне сервера. И PHP и XSL могут существенно сократить объемы страниц интернет ресурсов, позволяя хранить только их содержимое (в базе данных или в XML файлах): без параметров стилей форматирования, самой HTML разметки, ссылок и метатегов. Более того, они могут использоваться совместно: на первом этапе средствами PHP формируется XML документ, соответствующий структуре запрашиваемой пользователем интернет страницы, а на втором этапе XSL преобразует этот XML в HTML. На завершающем этапе все это дело форматирует и “раскрашивает” браузер уже на стороне клиента по правилам, указанным в CSS. Таким образом, экономится не только место на сервере, но и объем трафика, поскольку передаются данные в оптимальном для каждого конкретного случая XML формате.

Применением XSL весьма широкое. К примеру, XSL трансформация используется для преобразования результатов запросов в контексте работы информационных систем в удобный для восприятия, печати и дальнейшей обработки вид. Далее вашему вниманию будет представлен обзор основных конструкций XSL, инструмент для отладки схем трансформации и пример преобразования XML отчета в HTML.

Основные элементы или синтаксис XSL

Для составления XSL преобразований необходимы знания следующих стандартов:

  1. Синтаксис или XML схема языка преобразований XSL.
  2. Язык запросов к элементам XML документа XPath.
  3. Формат целевого документа (чаще всего HTML).

С HTML многие знакомы, про XPath можно узнать, перейдя по соответствующей ссылке, а список основных элементов XSL будет представлен ниже.

Заголовок схемы XSL трансформации

Определение заголовка схемы трансформации XSL является корневым элементом соответствующего XML документа. Файлам со схемами трансформации чаще всего дают расширения .xsl. Помимо определения пространства имен xsl, заголовок схемы трансформации может содержать параметры выведения (output) результата трансформации: xml, html или text. Если элемент output не указан явно, то его параметры определяются интерпретатором по ходу разбора схемы трансформации. Параметры вывода – различные атрибуты элемента output могут влиять на форматирование конечного результата: появление дополнительных пробелом, символов перевода каретки и т.п. Я обычно не уделяю особого внимания этому элементу, поскольку в случае преобразования в XML дополнительное форматирование или его отсутствие мне не мешает, а в случае HTML его обработка - проблемы интернет браузера. С обычным текстовым форматом вывода я не сталкивался.

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='html'/>
</xsl:stylesheet>

Шаблон XSL

Шаблон XSL используется для применения группы преобразований к определенному фрагменту XML документа. Группа преобразований помещается внутри определения шаблона, а целевой фрагмент документа отбирается посредством XPath запроса, указанного в атрибуте match. Самый распространенный вариант запроса – имя дочерних по отношению к контексту разбора элементов. Контекстом разбора до начала преобразований является сам документ и постепенно, по мере применения XSL шаблонов, контекст перемещается по структуре документа в соответствии с результатами XPath запросов. Пример шаблона ниже.

<xsl:template match="DataSet">
    <H1>
      <xsl:value-of select="@Caption" />
    </H1>
    <TABLE BORDER="1">
      <xsl:apply-templates select="Columns" />
      <xsl:apply-templates select="Records" />
    </TABLE>
  </xsl:template>

Как видно из примера, шаблон применяется к XML элементам DataSet. В результате преобразования формируется HTML заголовок с текстом, соответствующим атрибуту Caption трансформируемого элемента, создается HTML таблица и по очереди применяются к дочерним по отношению к DataSet элементам два шаблона: с запросами элементов Columns и Records. Шаблоны для обработки элементов Columns и Records должны быть определены в схеме трансформации отдельно.

Условные операторы XSL и вызов параметризованного шаблона

При должном владении XSL с его помощью можно даже писать небольшие программы. Я имею в виду не программное управление обработкой данных, а решение задач, которые вообще не связанны с их обработкой. Такие случаи, безусловно, экзотика, но в процессе обработки сложно структурированных данных без проверки условий и циклов иногда не обойтись. Спецификация XSL поддерживает условные операторы, вызовы шаблонов с передачей параметров, изменение значения параметров в соответствии с математическими выражениями и т.д. Пример шаблона с оператором выбора и условным оператором приведен ниже:

<xsl:template match="Column" mode="Row">
    <TD>
      <xsl:choose>
        <xsl:when test="@Name='S_NAME'">
          <xsl:call-template name="Name" />
        </xsl:when>
        <xsl:when test="@Name='S_EXPERIENCE'">
          <xsl:call-template name="AnyColumn">
            <xsl:with-param name="a">right</xsl:with-param>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:call-template name="AnyColumn">
            <xsl:with-param name="a">center</xsl:with-param>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
      <xsl:if test="@Caption=''">
        <p align="center">
          <b>-</b>
        </p>
      </xsl:if>
    </TD>
  </xsl:template>

В процессе обработки элементов Column анализируется значение атрибута Name и в зависимости от его значения вызывается определенный шаблон. Шаблоны могут иметь имя, и для их вызова используется конструкция call-template. Сами шаблоны Name и AnyColumn определены в документе отдельно. Шаблон AnyColumn к тому же является параметризованным – принимает параметры выравнивания текста в ячейке таблицы. Каждый элемент when соответствует варианту выбора, а элемент otherwise – всем остальным вариантам. Полное описание примера трансформации будет приведено в следующем разделе.

В конце тела шаблона присутствует условный оператор, с помощью которого определяется вид пустой ячейки: если значение атрибута Caption – пустая строка, то выводим символ “-”. Обратите внимание, что шаблон, помимо условия выбора элементов Column содержит атрибут mode со значением Row. Атрибут mode можно использовать для различных шаблонов с одинаковым значением атрибута match. В ходе трансформации именно значение атрибута mode в конструкциях применения шаблона apply-template будет определять выбор шаблона. Вот пример.

<xsl:template match="Columns">
    <TR>
      <xsl:apply-templates select="Column" mode="Header" />
    </TR>
  </xsl:template>
и
<xsl:template match="Records">
  …
      <TR>
        <xsl:apply-templates select="Column" mode="Row" />
      </TR>
    …
  </xsl:template>

Таким образом, если у шаблона не указано имя, то возможность его применения обусловлена контекстом трансформации в соответствии со значениями атрибута match и, дополнительно, атрибута mode. Место применения шаблона по контексту определяется конструкцией apply-template. Если шаблон имеет имя, то его можно принудительно применить к текущему контексту с использованием конструкции call-template без изменения самого контекста.

Цикл и сортировка в XSL

Язык XSL не только позволяет гибко настраивать трансформацию данных, но и проводить их предварительную сортировку. Сортировка доступна только в контексте перебора элементов, организованного циклом for-each. Какие элементы перебирать определяет атрибут select элемента for-each, а по каким данным их сортировать определяет уже атрибут select элемента sort. Значениями обоих этих атрибутов должно быть XPath выражение.

<xsl:template match="Records">
    <xsl:for-each select="Record">
      <xsl:sort select="Column[@Name='S_NAME']/@Caption" />
      <TR>
        <xsl:apply-templates select="Column" mode="Row" />
      </TR>
    </xsl:for-each>
  </xsl:template>

Определение параметризованного шаблона XSL и присвоение значений атрибутов

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

<xsl:template name="AnyColumn">
  <xsl:param name="a" />
    <p>
      <xsl:attribute name="align">
        <xsl:value-of select="$a" />
      </xsl:attribute>
      <xsl:value-of select="@Caption" />
    </p>
  </xsl:template>

Обратите внимание, каким образом выходному элементу p присваивается значение атрибута align – c помощью отдельной конструкции attribute и конструкции value-of, которая обращается к значению входного параметра.

Отладчик XSL схем

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

Отладчик XSL
Отладчик XSL.

Скачать демонстрационную программу.
Скачать пример XSL трансформации.
Скачать Microsoft .NET Framework 3.5 SP1.

Окно отладчика XSL разделено на 4 части: область редактирования XSL, область просмотра входного XML, область просмотра результата трансформации в текстовом виде HTML и область просмотра результата в интернет браузере. В качестве примера данных используется все тот же отчет, что рассматривался в ходе изучения XPath, а в качестве XSL схемы – преобразование отчета в таблицу HTML. Фрагменты этой схемы трансформации уже были представлены выше в разделе описания синтаксиса XSL. Теперь все это предстанет в виде единого документа. Вот перечень требований к результатам трансформации:

  • Список персонала должен быть отсортирован по значению Ф.И.О. в алфавитном порядке.
  • Выравнивание первой колонки по левому краю, выравнивание стажа по правому краю, выравнивание всех остальных колонок по центру.
  • Пустые значения обозначаются прочерком.

Надеюсь, что эта программа сможет стать полезным инструментом в процессе составления вами своих собственных схем трансформации данных. Пройдя по следующей ссылке, можно увидеть, как выглядит результат XSL трансформации на стороне клиента.


Пример XSL трансформации на C# можно посмотреть здесь.



Компьютерные курсы и курсы программирования
Основы программирования

Курс для начинающих программистов на C# и VB.NET.

SQL 25™

Построение SQL запросов и работа с базой данных.

C# Quick Guide™

Программирование на C#. Краткое руководство.

RegEx

Применение регулярных выражений.

Plug-in архитектура

Примеры программной Plug-in архитектуры.

XML и его расширения

Язык разметки XML и его расширения с примерами.

HTML и разметка гипертекста

Языки HTML, XHTML и CSS с примерами разметки.

Основы веб-дизайна

Основы веб-дизайна: решения типовых задач верстки.

Программирование на PHP

Руководство по программированию на PHP для начинающих.

Справочные материалы

Шаблоны проектирования
Каталог шаблонов проектирования программных компонентов.

Рефакторинг кода
Каталог приемов рефакторинга программного кода.

Гость
Имя

Пароль



Забыли пароль?
Запросите новый здесь
.
Coding Craft. Все права защищены © 2011. Проект Инициативного Народного Фронта Образования - ИНФО-проект.