Что такое XSLT?

07fig01XSLT — это мощное средство для трансформации XML-данных. Его часто используют как web-шаблонизатор: на вход подаётся XML-документ и XSLT-преобразование, а на выходе получают HTML-документ. Процесс получения HTML-документа из XML называют отображением или рендерингом.

Рассмотрим типичный пример рендеринга HTML.

 

Дан список музыкальных композиций в виде XML-документа.

<?xml version="1.0" encoding="utf-8"?>
<PlayList>
  <Track Id="1170056tuNb" Length="280">
    <Artist>Рихард Вагнер</Artist>
    <Title>Полёт валькирии</Title>
  </Track>
  <Track Id="938304vu1E" Length="163">
    <Artist>Эдвард Григ</Artist>
    <Title>В пещере горного короля</Title>
  </Track>
  <Track Id="35532014SEz" Length="187">
    <Artist>Иоган Бах</Artist>
    <Title>Токката и фуга ре-минор</Title>
  </Track>
  <Track Id="264667GXiD" Length="203">
    <Artist>Антонио Вивальди</Artist>
    <Title>Времена года. Лето. Шторм</Title>
  </Track>
  <Track Id="613982Fj9E" Length="103">
    <Artist>Джузеппе Верди</Artist>
    <Title>Триумфальный марш (Аида)</Title>
  </Track>
</PlayList>

Отобразим данный документ в виде HTML ul/li списка, как это показано ниже:

Список трэков в HTML формате

Для этого используем следующее XSLT-преобразование:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet [
  <!ENTITY mdash "&#8212;"> ]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

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

  <xsl:template match="PlayList">
    <ul>
      <xsl:apply-templates select="Track"/>
    </ul>
  </xsl:template>

  <xsl:template match="Track">
    <li>
      <a href="http://prostopleer.com/tracks/{@Id}">
        <xsl:value-of select="Artist"/>
        <xsl:text> &mdash; </xsl:text>
        <xsl:value-of select="Title"/>
      </a>
    </li>
  </xsl:template>
</xsl:stylesheet>

Данное преобразование вернёт нам следующий HTML:

<ul>
  <li>
    <a href="http://prostopleer.com/tracks/1170056tuNb">Рихард Вагнер — Полёт валькирии</a>
  </li>
  <li>
    <a href="http://prostopleer.com/tracks/938304vu1E">Эдвард Григ — В пещере горного короля</a>
  </li>
   ...
</ul>

XSLT-преобразование состоит из трёх шаблонов (xsl:template). Каждый шаблон обслуживает свою сущность, что даёт нам возможность легко вносить изменения и делает код понятным.

Если нам надо поменять отображение списка (например, добавить атрибут class), то мы редактируем шаблон match="PlayList".

Если же мы хотим изменить отображение элементов списка, то тут, совершенно очевидно, что стоить менять шаблонmatch="Track"

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

Конечно, в более сложных случаях разделения добиться такого разделения бывает сложно. Очень легко прийти к ситуации, когда возникает «божественный шаблон», который делает всё, так же стоит бояться скатиться к «стрельбе дробью» кучей мелких шаблонов.