XSL Transformations

XSL Transformations

XSLT (Extensible Stylesheet Language Transformations) — часть спецификации XML-документов. Спецификация XSLT является рекомендацией W3C.

При применении таблицы стилей XSLT, состоящей из набора шаблонов, к XML-документу (исходное дерево) образуется конечное дерево, которое может быть другой XML-структурой, XPath.

XSLT имеет множество различных применений, в основном в области web-программирования и генерации отчётов. Одной из задач, решаемых языком XSLT, является отделение данных от их представления, как часть общей парадигмы MVC (англ. Model-view-controller). Другой стандартной задачей является преобразование XML-документов из одной XML-схемы в другую.

Консорциум W3 определяет три составные части языка англ. eXtensible Stylesheet Language — Расширяемый Язык Стилей): XSLT, XSL-FO (англ. eXtensible Markup Language Formatting Objectsязык разметки типографских макетов и иных предпечатных материалов.

Содержание

Пример 1 (трансформация из XML в XML)

Исходный

<?xml version="1.0"?>
<persons>
  <person username="MP123456">
    <name>Иван</name>
    <surname>Иванов</surname>
  </person>
  <person username="PK123456">
    <name>Пётр</name>
    <surname>Петров</surname>
  </person>
</persons>

Таблица XSLT-стилей (преобразования):

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
 <xsl:template match="/">
    <transform>
       <xsl:apply-templates/>
    </transform>
 </xsl:template>
 <xsl:template match="person">
     <record>
        <username>
           <xsl:value-of select="@username" />
        </username>
        <fullname>
           <xsl:value-of select="name" /><xsl:text> </xsl:text><xsl:value-of select="surname" />
        </fullname> 
     </record> 
  </xsl:template>
</xsl:stylesheet>

Результирующий XML-документ:

<?xml version="1.0" encoding="UTF-8"?>
<transform>
   <record>
      <username>MP123456</username>
      <fullname>Иван Иванов</fullname>
   </record>
   <record>
      <username>PK123456</username>
      <fullname>Пётр Петров</fullname>
   </record>  
</transform>

Пример 2 (трансформация из XML в XHTML)

Входной XML-документ:

<?xml version="1.0" encoding="UTF-8"?>
 
<domains>
    <sun.com ownedBy="Sun Microsystems Inc.">
        <host>
            www
            <use>World Wide Web site</use>
        </host>
        <host>
            java
            <use>Java info</use>
        </host>
    </sun.com>
 
    <w3.org ownedBy="The World Wide Web Consortium">
        <host>
            www
            <use>World Wide Web site</use>
        </host>
        <host>
            validator
            <use>web developers who want to get it right</use>
        </host>
    </w3.org>
</domains>

Стиль для XSLT-трансформации:

<?xml version="1.0" encoding="UTF-8" ?>
 
<xsl:stylesheet version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns="http://www.w3.org/1999/xhtml">
    <xsl:output method="xml" indent="yes"
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" 
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
 
    <!--XHTML document outline--> 
    <xsl:template match="/">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
                <title>test1</title>
                <style type="text/css">
                    h1          { padding: 10px; padding-width: 100%; background-color: silver }
                    td, th      { width: 40%; border: 1px solid silver; padding: 10px }
                    td:first-child, th:first-child  { width: 20% } 
                    table       { width: 650px }
                </style>
            </head>
            <body>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
 
    <!--Table headers and outline-->
    <xsl:template match="domains/*">
        <h1><xsl:value-of select="@ownedBy"/></h1>
        <p>The following host names are currently in use at
          <strong><xsl:value-of select="local-name(.)"/></strong>
        </p>
        <table>
            <tr><th>Host name</th><th>URL</th><th>Used by</th></tr>
            <xsl:apply-templates/>
        </table>
    </xsl:template>
 
    <!--Table row and first two columns-->
    <xsl:template match="host">
        <!--Create variable for 'url', as it's used twice-->
        <xsl:variable name="url" select=
            "normalize-space(concat('http://', normalize-space(node()), '.', local-name(..)))"/>
        <tr>
            <td><xsl:value-of select="node()"/></td>
            <td><a href="{$url}"><xsl:value-of select="$url"/></a></td>
            <xsl:apply-templates select="use"/>
        </tr>
    </xsl:template>
 
    <!--'Used by' column-->
    <xsl:template match="use">
        <td><xsl:value-of select="."/></td>
    </xsl:template>
 
</xsl:stylesheet>

XHTML, который мы получаем на выходе (пробелы были добавлены для ясности):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <meta content="text/html;charset=UTF-8" http-equiv="Content-Type" />
    <title>test1</title>
    <style type="text/css">
      h1          { padding: 10px; padding-width: 100%; background-color: silver }
      td, th      { width: 40%; border: 1px solid silver; padding: 10px }
      td:first-child, th:first-child  { width: 20% } 
      table       { width: 650px }
    </style>
  </head>
  <body>
    <h1>Sun Microsystems Inc.</h1>
    <p>The following host names are currently in use at <strong>sun.com</strong></p>
    <table>
        <tr>
          <th>Host name</th>
          <th>URL</th>
          <th>Used by</th>
        </tr>
        <tr>
          <td>www</td>
          <td><a href="http://www.sun.com">http://www.sun.com</a></td>
          <td>World Wide Web site</td>
        </tr>
        <tr>
          <td>java</td>
          <td><a href="http://java.sun.com">http://java.sun.com</a></td>
          <td>Java info</td>
        </tr>
    </table>
 
    <h1>The World Wide Web Consortium</h1>
    <p>The following host names are currently in use at <strong>w3.org</strong></p>
    <table>
      <tr>
        <th>Host name</th>
        <th>URL</th>
        <th>Used by</th>
      </tr>
      <tr>
        <td>www</td>
        <td><a href="http://www.w3.org">http://www.w3.org</a></td>
        <td>World Wide Web site</td>
      </tr>
      <tr>
        <td>validator</td>
        <td><a href="http://validator.w3.org">http://validator.w3.org</a></td>
        <td>web developers who want to get it right</td>
      </tr>
    </table>
  </body>
</html>

На выходе не всегда получится обязательно правильный XHTML. В XSLT 2.0 это исправлено — добавлен метод вывода 'XHTML', наряду с 'HTML', который уже существовал в XSLT 1.0.

Применение правил шаблонов

Язык XSLT является декларативным, не процедурным; вместо определения последовательности исполняемых операторов, этот язык определяет правила и другие подсказки, применяемые во время преобразования, согласно чёткому алгоритму. Этот алгоритм, в чём-то нетривиальный, описывается ниже, хотя многие из его экзотических деталей опущены.

Каждый XSLT-процессор должен выполнить следующие шаги для подготовки к трансформации:

  1. Прочитать таблицу стилей XSLT с помощью XML-парсера и перевести его содержимое в дерево узлов (дерево таблицы стилей), согласно модели данных XPath. Синтаксические ошибки «времени компиляции» определяются на этой стадии. Таблицы стилей могут быть модульными, поэтому все включения (инструкции xsl:include, xsl:import) также будут обработаны на этой стадии с целью объединить все шаблонные правила и иные элементы из других таблиц стилей в единое дерево таблицы стилей.
  2. Прочитать входные данные XML с помощью XML-парсера перевести его содержимое в дерево узлов (исходное дерево), согласно модели данных XPath. XML-документ может ссылаться на другие XML-источники с помощью вызова функций document(). Эти вызовы обычно обрабатываются во время выполнения, так как их расположение может являться вычисляемым, а вызовы соответствующих фунцкий могут не происходить вовсе. (Пример выше не ссылается на какие либо другие документы.)
  3. Удалить пустые узлы из таблицы стилей XSLT, кроме тех, которые являются потомками от элементов xsl:text. Это позволяет исключить появление «лишних» пробелов.
  4. Удалить пустые текстовые узлы из исходного дерева, если инструкции xsl:strip-space присутствуют в исходном документе. Это позволяет исключить появление «лишних» пробелов. (Пример выше не использует эту возможность)
  5. Пополнить XSLT-дерево тремя правилами, которые предоставляют поведение по умолчанию для любых типов узлов, которые могут быть встречены при обработке. Первое правило — для обработки корневого узла; оно даёт инструкцию процессору обработать каждого потомка корневого узла. Второе правило — для любых текстовых узлов или узлов атрибутов; он даёт команду процессору сделать копию этого узла в результирующем дереве. Третье правило — для всех узлов комментария и узлов-инструкций обработки; никакой операции не производится. Шаблоны, явно заданные в XSLT, могут перекрывать часть или все шаблоны-правила, заданные по умолчанию. Если шаблон не содержит явных правил, встроенные правила будут применены для рекурсивного обхода исходного дерева и только текстовые узлы будут скопированы в результирующее дерево (узлы атрибутов не будут достигнуты, так как они не являются «детьми» их родительских узлов). Полученный таким образом результат обычно нежелателен, так как он является просто конкатенацией всех текстовых фрагментов из исходного XML-документа.

Затем процессор проделывает следующие шаги для получения и сериализации результирующего дерева:

  1. Создаёт корневой узел результирующего дерева.
  2. Обрабатывает корневой узел исходного дерева. Процедура обработки узла описана ниже.
  3. Сериализует результирующее дерево, если необходимо, согласно подсказкам, описанным инструкцией xsl:output.

При обработке узла прозводятся следующие действия:

  1. Производится поиск наиболее подходящего шаблона правила. Это достигается проверкой соответствия шаблона (который является выражением XPath) для каждого правила, указывая узлы, для которых правило может быть применено. Каждому шаблону процессором назначается относительный приоритет и старшинство для облегчения разрешения конфликтов. Порядок шаблонных правил в таблице стилей также может помочь разрешению конфликтов между шаблонами, которые соответствуют одинаковым узлам, но это не оказывает влияния на порядок, в котором узлы будут обрабатываться.
  2. Template rule contents are instantiated. Элементы в пространстве имён XSLT (обычно имеющие префикс xsl:) трактуются как инструкции и имеют специальную семантику, которая указывает на то, как они должны интерпретироваться. Одни предназначены для добавления узлов в результирующее дерево, другие являются управляющими конструкциями. Не XSLT-элементы и текстовые узлы, обнаруженные в правиле, копируются, «дословно», в результирующее дерево. Комментарии и управляющие инструкции игнорируются.

Инструкция xsl:apply-templates при её обработке приводит к выборке и обработке нового набора узлов. Узлы идентифицируются с помощью выражения XPath. Все узлы обрабатываются в том порядке, в котором они содержатся в исходном документе.

XSLT расширяет библиотеку функций XPath’s и позволяет определять XPath-переменные. Эти переменные имеют разную область видимости в таблице стилей, в зависимости от того, где они были определены и их значения могут задаваться за пределами таблицы стилей. Значения переменных не могут быть изменены во время обработки.

Хотя эта процедура может показаться сложной, однако она делает XSLT по возможностям похожей на другие языки web-шаблонов. Если таблица стилей состоит из единственного правила, предназначенного для обработки корневого узла, в результат просто копируется всё содержимое шаблона, а XSLT-инструкции (элементы 'xsl:…') заменяются вычисляемым содержимым. XSLT предлагает даже специальный формат («literal result element as stylesheet») для таких простых, одношаблонных трансформаций. Однако, возможность определять отдельные шаблоны и правила сильно увеличивает гибкость и эффективность XSLT, особенно при генерации результата, который очень похож на исходный документ.

См. также

Игры ⚽ Поможем решить контрольную работу

Полезное


Смотреть что такое "XSL Transformations" в других словарях:

  • XSL Transformations — infobox file format name = XSL Transformations extension = .xsl, .xslt mime = application/xslt+xml [ [http://www.w3.org/TR/xslt20/#xslt mime definition XSL Transformations (XSLT) Version 2.0 ] ] owner = [http://www.w3.org/ World Wide Web… …   Wikipedia

  • XSL Transformations — Vorlage:Infobox Dateiformat/Wartung/magic fehltVorlage:Infobox Dateiformat/Wartung/website fehlt XSL Transformations Dateiendung .xsl …   Deutsch Wikipedia

  • XSL — (eXtensible Stylesheet Language) семейство рекомендаций консорциума W3C, описывающее языки преобразования и визуализации XML документов. Состоит из трех частей: XSL Transformations (XSLT) язык преобразований XML документов. XSL Formatting Objects …   Википедия

  • XSL — (Extensible Stylesheet Language) ist eine in XML notierte Familie von Transformationssprachen zur Definition von Layouts für XML Dokumente. Die XSL Subsprache XSLT wird außerdem zur Übersetzung/Transformation eines XML Formats in ein anderes XML… …   Deutsch Wikipedia

  • XSL-T — Vorlage:Infobox Dateiformat/Wartung/magic fehltVorlage:Infobox Dateiformat/Wartung/website fehlt XSL Transformations Dateiendung .xsl …   Deutsch Wikipedia

  • XSL Transformation — Vorlage:Infobox Dateiformat/Wartung/MagischeZahl fehltVorlage:Infobox Dateiformat/Wartung/Website fehlt XSL Transformations Vorlage:Infobox Dateiformat/Wartung/Screenshot Format …   Deutsch Wikipedia

  • Extensible Stylesheet Language Transformations — XSL Transformations Extension .xsl, .xslt Type MIME application/xslt+xml[1] Développé par World Wide Web Consortium Type de format …   Wikipédia en Français

  • XSL Formatting Objects — Infobox file format name = XSL Formatting Objects icon = logo = extension = .xml mime = application/xml, text/xml (deprecated) type code = uniform type = public.xml magic = owner = [http://www.w3.org/ World Wide Web Consortium] genre = Markup… …   Wikipedia

  • EXtensible Stylesheet Language Transformations — XSL Transformations Extension de fichier .xsl, .xslt Type MIME application/xslt+xml[1] Développé par …   Wikipédia en Français

  • Extended Stylesheet Language Transformations — Extensible Stylesheet Language Transformations XSL Transformations Extension de fichier .xsl, .xslt Type MIME application/xslt+xml[1] Développé par …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»