Опубликован: 25.07.2012 | Уровень: специалист | Доступ: платный
Лекция 6:

Применение языка преобразований XSLT

< Лекция 5 || Лекция 6: 12 || Лекция 7 >
Аннотация: Рассматривается генерация кода преобразованиями XSLT. Изучается синтаксис XSLT, особенности применения преобразований, а также выполнение таких операций, как фильтрация, сортировка, выборка по условию в шаблонах. Выполнение трансформации программным путем в C#. Преимущества и недостатки технологии.

Язык преобразований XSLT

Во второй лекции мы уже рассматривали пример с использованием XSLT. В этой лекции мы рассмотрим эту технологию более подробно. XSL (eXtensible Stylesheet Language) переводится как Расширяемый Язык Стилей, и представляет собой язык для создания стилей XML документов. XSLT(XSL Transformations) - это язык преобразований XSL и является его частью. Стиль XSLT предназначен для преобразования иерархической структуры и формата документа XML. Результатами преобразования могут стать XML-файл, текстовый файл, программный код, HTML-файл, файл в формате PDF, и так далее. Этот язык предоставляет мощные возможности для манипуляции данными, информацией, текстом в иерархическом виде.

А это как раз то, что нужно для генерации кода. Применение XSLT может существенно помочь в генерации кода. Кроме того, он предоставляет удобную альтернативу технологии шаблонов Т4.

XSLT был разработан консорциумом W3C (World Wide Web Consortium). Первая версия языка XSLT 1.0 стала рекомендацией 16 ноября 1999 года, а версия XSLT 2.0 стала рекомендацией 23 января 2007 года. Обе версии используются достаточно активно, и в этой лекции мы рассмотрим ту базовую функциональность, которая является для них общей. А это значит, что рассматривать будем в основном первую версию. Также упомянем некоторые команды из второй версии.

Как работает XSLT

Модель XSLT включает в себя такие части как:

  • документы XML,
  • стили XSLT,
  • процессор XSLT,
  • выходные документы.

Документы XML являются входными данными, которые нужно преобразовать в другие документы. Документ стиля XSLT является корректным (well formed) документом XML и содержит набор правил для выполнения преобразования. Иными словами, документ стиля является шаблоном.

Процессор XSLT является приложением, которое принимает в качестве входных данных документы XML и стили XSLT. Он выполняет трансформацию, то есть применение набора правил в стилях XSLT к документам XML. Результатом этой работы являются выходные документы.

Процессоры XSLT имеют множество реализаций и встроены во многие браузеры вроде Internet Explorer, Firefox, Mozilla, Opera и другие. В Internet Explorer используется инструмент MSXML, разработанный Microsoft. XSLT-процессор встроен в Internet Explorer, начиная с версии 4.5. Сгенерированный результат примеров данной лекции можно просматривать путем открытия XML-файлов в одном из браузеров. В конце лекции мы рассмотрим возможности запуска трансформации программным путем, используя соответствующие классы языка программирования.

XPath

Другой частью технологии XSL является язык XPath, предназначенный для доступа к узлам документа XML путем задания путей и выражений. Язык Xpath используется в файлах стилей для навигации внутри XML-документов, определения частей исходного XML-документа, которые совпадают с одним или более заранее заданными шаблонами. При нахождении совпадения процессор XSLT применит к нему соответствующие правила из файла стиля и преобразует его в часть результирующего документа. В файлах стилей XSLT выражения XPath используются весьма интенсивно.

Применение XSLT

Язык XSLT состоит из множества инструкций, записанных в виде тегов. Имя каждой инструкции обычно начинается с символов xsl. Для выполнения трансформации документ стиля XSLT должен являться корректным документом XML.

Для преобразования документа XML необходимо добавить в начало документа инструкцию, подобную следующей:

<?xml-stylesheet type="text/xsl" href="MyStyle.xsl"?>
    

XSL-файл стилей обычно содержит множество элементов, самым главным из которых является элемент xsl:stylesheet. Именно он указывает, что данный XML-файл является файлом стилей. Кроме него могут содержаться другие элементы, например xsl:template, xsl:value-of. Документ XML и файл стиля передается в XSLT-процессор, который обрабатывает данные файлы, выполняет преобразование и выводит результат трансформации.

Ниже представлен документ XML, содержащий список языков программирования.

<?xml-stylesheet type="text/xsl" href="languages.xsl"?>
<languages>
  <language>C#</language>
  <language>Visual Basic</language>
  <language>Delphi</language>
  <language>Prolog</language>
</languages>
    
Пример 5.1. Файл languages.xml

Необходимо вывести этот список в формате HTML. Для этой цели используем инструкцию xsl:for-each, которая будет применять часть шаблона к секциям документа, наименование которых указано в атрибуте select. В нашем случае укажем select="languages/language".

Файл стилей будет применяться следующий:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <H4>Мои любимые языки:</H4>
    <xsl:for-each select="languages/language">
      - <xsl:value-of select="."/><BR/>
    </xsl:for-each>
    <BR/>
  </xsl:template>
</xsl:stylesheet>
    
Пример 5.2. Файл languages.xsl

Шаблон внутри xsl:for-each выводит содержимое каждого элемента language из languages. Для этой цели используется инструкция xsl:value-of и задаваемый атрибут select=".". Это означает, что процессор должен выбирать текст содержимого текущего элемента в документе. Кроме отражения содержимого можно задавать имена конкретных тегов, а также атрибутов для выборки значений, хранящихся в них. Примеры будут рассмотрены далее.

Откроем XML файл через Internet Explorer или другой браузер. Будет выведен такой текст:

Мои любимые языки:

  • C#
  • Visual Basic
  • Delphi
  • Prolog

Одним из самых главных элементов в стиле является xsl:template. Служит для определения повторно используемого шаблона и содержит правила, по которым будет преобразован документ XML. В атрибуте match содержится выражение для отбора узлов, к которым будет применен шаблон. Также может присутствовать атрибут name. В этом случае есть возможность вызывать шаблон по имени инструкцией xsl:apply-templates.

Для повторения вывода шаблона для каждого элемента документа применяется инструкция xsl:for-each. Шаблон выполняется для каждого элемента, соответствующего условию, указанному в атрибуте select.

Инструкция xsl:value-of служит для вычисления выражения, записанного в атрибуте select с последующим выводом результата в том месте, где расположен сам элемент.

Фильтрация

Мы рассмотрели случай, когда считываются значения каждого узла. Однако часто возникает необходимость выбирать только часть данных, то есть их надо фильтровать. Шаблоны XSLT поддерживают два способа фильтрации.

Один из них - это применение атрибута select инструкции xsl:for-each, а второй - применение атрибута match элемента xsl:template. Применение match мы рассмотрим позже, а сейчас рассмотрим select.

Изменим немного файл с данными: добавим атрибут high, обозначающий, является ли язык из нашего списка языком высокого уровня. Также расширим сам список языков.

<?xml-stylesheet type="text/xsl" href="languages4.xsl"?>
<languages>
  <language high="true">C#</language>
  <language high="true">Visual Basic</language>
  <language high="true">Delphi</language>
  <language high="true">Prolog</language>
  <language high="false">Assembler</language>
  <language high="true">Java</language>
  <language high="true">Perl</language>
</languages>
    
Пример 5.3. Файл languages4.xml

Заметим, что значение false для атрибута high стоит только для значения "Assembler". Изменим немного файл таблицы стилей:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <H4>Языки высокого уровня:</H4>
    <xsl:for-each select="languages/language[@high='true']">
      - <xsl:value-of select="."/><BR/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
    
Пример 5.4. Файл languages4.xsl

В секции [@high='true'] мы указываем, что выбирать следует только те узлы документа, у которых атрибут high имеет значение 'true'. Знак @ является символом, указывающим на то, что после него стоит имя атрибута.

Посмотрим на результат:

Языки высокого уровня:

  • C#
  • Visual Basic
  • Delphi
  • Prolog
  • Java
  • Perl

Как видим, значение "Assembler" не отображается в списке языков, то есть процессор XSLT отфильтровал данные согласно заданным условиям.

Сортировка

Кроме фильтрации другой часто применяемой операцией при генерации кода является сортировка. Атрибут order-by инструкции xsl:for-each служит для сортировки результата, для обозначения порядка прохода узлов документа при выполнении трансформации. Сортируемые поля перечисляются через точку с запятой, а также имеют перед своим названием знаки "+" или "-", означающие сортировку по возрастанию или убыванию.

Рассмотрим немного измененный вариант документа - вместо атрибута high будем использовать элемент level, принимающий значения high или low. А имя языка запишем в элемент name.

<?xml-stylesheet type="text/xsl" href="languages6.xsl"?>
<languages>
  <language>
    <name>C#</name>
    <level>high</level>
  </language>
  <language>
    <name>Visual Basic</name>
    <level>high</level>
  </language>
  <language>
    <name>Delphi</name>
    <level>high</level>
  </language>
  <language>
    <name>Prolog</name>
    <level>high</level>
  </language>
  <language>
    <name>Assembler</name>
    <level>low</level>
  </language>
  <language>
    <name>Java</name>
    <level>high</level>
  </language>
  <language>
    <name>Perl</name>
    <level>high</level>
  </language>
</languages>
    
Пример 5.5. Файл languages6.xml

В следующей таблице стилей для инструкции xsl:for-each применим атрибут order-by со значением +name, где знак плюса означает, что надо отсортировать по возрастанию.

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <H4>Языки высокого уровня:</H4>
    <xsl:for-each select="languages/language[level='high']" order-by="+name">
      -<xsl:value-of select="name"/><BR/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
    
Пример 5.6. Файл languages6.xsl

В атрибуте select мы фильтруем по значению элемента level. Также в атрибуте select инструкции xsl:value-of указываем непосредственно имя элемента.

Получается такой результат.

Языки высокого уровня:

  • C#
  • Delphi
  • Java
  • Perl
  • Prolog
  • Visual Basic

Названия языков отсортированы в алфавитном порядке и значение "Assembler" не отображается в списке.

Другим способом сортировки является применение элемента xsl:sort путем вложения в xsl:for-each или в xsl:apply-templates. Элемент xsl:sort имеет атрибуты select и order, которые указывают на элементы, по которым должна осуществляться сортировка и на порядок сортировки соответственно.

Вложенные шаблоны

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

<?xml-stylesheet type="text/xsl" href="multiple.xsl"?>
<database>
  <table name="book">
    <field>id</field>
    <field>title</field>
    <field>author_id</field>
  </table>
  <table name="author">
    <field>id</field>
    <field>first_name</field>
    <field>last_name</field>
  </table>
</database>
    
Пример 5.7. Файл multiple.xml

В данном примере у нас будут два шаблона. Один будет основной, для таблиц, а другой будет вызываемым из него, для полей таблиц. Для вызова шаблона используется инструкция xsl:apply-templates.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"/>
  <xsl:template match="/">
    <H4>Таблицы базы данных</H4>
    <xsl:for-each select="database/table">
      <table border="1" width="150">
        <tr>
          <td><b><xsl:value-of select="@name"/></b></td>
        </tr>
        <xsl:apply-templates select="field"/>
      </table>
      <br/>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="field">
        <tr>
          <td><xsl:value-of select="."/></td>
        </tr>
  </xsl:template>
</xsl:stylesheet>
    
Пример 5.8. Файл multiple.xsl

XSLT-процессором будет сформирован следующий HTML-код:

<H4>Таблицы базы данных</H4>
  <table border="1" width="150">
    <tr>
      <td><b>book</b></td>
    </tr>
    <tr>
      <td>id</td>
      <td>title</td>
      <td>author_id</td>
    </tr>
  </table>
  <br/>
  <table border="1" width="150">
    <tr>
      <td><b>author</b></td>
    </tr>
    <tr>
      <td>id</td>
      <td>first_name</td>
      <td>last_name</td>
    </tr>
  </table>
  <br/>
    
Пример 5.9.

При открытии сгенерированного результата в браузере будет показано следующее:

Результат в браузере

Рис. 5.1. Результат в браузере

Инструкция xsl:apply-templates позволяет вызывать определенный шаблон и выполнять его много раз. Кроме того она является более наглядной и удобной альтернативой xsl:for-each.

< Лекция 5 || Лекция 6: 12 || Лекция 7 >
Дмитрий Клочков
Дмитрий Клочков
Россия, Рубцовск
Волков Олег
Волков Олег
Украина, Днепропетровск