XSLT: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
Altes (обсуждение | вклад) отмена ошибочной правки |
Gromolyak (обсуждение | вклад) Метки: с мобильного устройства через мобильное приложение через приложение для Android App section source |
||
(не показаны 44 промежуточные версии 30 участников) | |||
Строка 1: | Строка 1: | ||
{{Технологический стандарт}} |
|||
'''XSLT''' (''e'''X'''tensible '''S'''tylesheet '''L'''anguage '''T'''ransformations'') — язык преобразования [[XML]]-документов. Спецификация XSLT входит в состав [[XSL]] и является рекомендацией [[W3C]]. |
'''XSLT''' (''e'''X'''tensible '''S'''tylesheet '''L'''anguage '''T'''ransformations'') — язык преобразования [[XML]]-документов. Спецификация XSLT входит в состав [[XSL]] и является рекомендацией [[W3C]]. |
||
При применении ''таблицы стилей'' XSLT, состоящей из набора ''шаблонов'', к XML-документу (''исходное дерево'') образуется ''конечное дерево'', которое может быть [[Сериализация|сериализовано]] в виде XML-документа, [[XHTML]]-документа (только для XSLT 2.0), [[HTML]]-документа или [[Текстовые данные|простого текстового файла]]. Правила выбора (и, отчасти, преобразования) данных из исходного дерева пишутся на языке запросов [[XPath]]. |
При применении ''таблицы стилей'' XSLT, состоящей из набора ''шаблонов'', к XML-документу (''исходное дерево'') образуется ''конечное дерево'', которое может быть [[Сериализация|сериализовано]] в виде XML-документа, [[XHTML]]-документа (только для XSLT 2.0), [[HTML]]-документа или [[Текстовые данные|простого текстового файла]]. Правила выбора (и, отчасти, преобразования) данных из исходного дерева пишутся на языке запросов [[XPath]]. |
||
XSLT имеет множество различных применений, в основном в области |
XSLT имеет множество различных применений, в основном в области [[Веб-программирование|веб-программирования]] и генерации отчётов. Одной из задач, решаемых языком XSLT, является отделение данных от их представления, как часть общей парадигмы MVC ({{lang-en|[[Model-view-controller]]}}). Другой стандартной задачей является преобразование XML-документов из одной [[XML Schema|XML-схемы]] в другую. |
||
== История == |
== История == |
||
Строка 10: | Строка 11: | ||
Версия 1.0 была одобрена в качестве рекомендации 16 ноября [[1999 год]]а. После выхода первой версии начались работы над версией 1.1, но в [[2001 год]]у они были прекращены, а рабочая группа [[XSL]] присоединилась к рабочей группе [[XQuery]] для совместной работы над [[XPath|XPath 2.0]]. Впоследствии XPath 2.0 послужил основой при разработке XSLT версии 2.0. |
Версия 1.0 была одобрена в качестве рекомендации 16 ноября [[1999 год]]а. После выхода первой версии начались работы над версией 1.1, но в [[2001 год]]у они были прекращены, а рабочая группа [[XSL]] присоединилась к рабочей группе [[XQuery]] для совместной работы над [[XPath|XPath 2.0]]. Впоследствии XPath 2.0 послужил основой при разработке XSLT версии 2.0. |
||
Версия 2.0 была одобрена в качестве рекомендации 24 января [[2007 год]]а |
Версия 2.0 была одобрена в качестве рекомендации 24 января [[2007 год]]а. |
||
Версия 3.0 была одобрена 8 июня 2017 года. |
|||
== Процесс выполнения XSLT-преобразования == |
== Процесс выполнения XSLT-преобразования == |
||
В процессе выполнения XSLT-преобразования задействованы: |
В процессе выполнения XSLT-преобразования задействованы: |
||
* один или несколько ''входных'' XML-документов; |
* один или несколько ''входных'' XML-документов; |
||
* одна или несколько ''таблиц |
* одна или несколько ''таблиц стилей'' XSLT; |
||
* ''XSLT-процессор''; |
* ''XSLT-процессор''; |
||
* один или несколько ''выходных'' документов. |
* один или несколько ''выходных'' документов. |
||
В простейшем случае XSLT-процессор получает на входе два документа — входной [[XML]]-документ и таблицу стилей XSLT — и |
В простейшем случае XSLT-процессор получает на входе два документа — входной [[XML]]-документ и таблицу стилей XSLT — и создаёт на их основе выходной документ. |
||
== XSLT и XPath == |
== XSLT и XPath == |
||
Строка 28: | Строка 31: | ||
== Примеры == |
== Примеры == |
||
=== Трансформация из XML в |
=== Трансформация из XML в XSLT === |
||
Исходный [[XML]]-документ: |
Исходный [[XML]]-документ: |
||
Строка 263: | Строка 266: | ||
== Применение правил шаблонов == |
== Применение правил шаблонов == |
||
Язык XSLT является декларативным, а не процедурным. Вместо определения последовательности исполняемых операторов |
Язык XSLT является декларативным, а не процедурным. Вместо определения последовательности исполняемых операторов этот язык определяет правила, которые будут применяться во время преобразования. Само преобразование ведётся по фиксированному алгоритму. |
||
В первую очередь XSLT |
В первую очередь XSLT-процессор разбирает файл преобразования и строит XML-дерево входного файла. Затем он ищет шаблон, который лучше всего подходит для корневого узла и вычисляет содержимое найденного шаблона. Инструкции в каждом шаблоне могут либо напрямую говорить XSLT-процессору «создай здесь такой-то тег» либо говорить «обработай другие узлы по тому же правилу, что и корневой узел». |
||
Более подробно этот алгоритм, в чём-то нетривиальный, описывается ниже, хотя многие из его экзотических деталей опущены. |
Более подробно этот алгоритм, в чём-то нетривиальный, описывается ниже, хотя многие из его экзотических деталей опущены. |
||
Каждый XSLT-процессор должен выполнить следующие шаги для подготовки к трансформации |
Каждый XSLT-процессор должен выполнить следующие шаги для подготовки к трансформации. |
||
# Прочитать таблицу стилей XSLT с помощью XML-парсера и перевести его содержимое в дерево узлов (''дерево таблицы стилей'') |
# Прочитать таблицу стилей XSLT с помощью XML-парсера и перевести его содержимое в дерево узлов (''дерево таблицы стилей'') согласно модели данных XPath. Синтаксические ошибки «времени компиляции» определяются на этой стадии. Таблицы стилей могут быть модульными, поэтому все включения (инструкции <code>xsl:include</code>, <code>xsl:import</code>) также будут обработаны на этой стадии с целью объединить все шаблонные правила и иные элементы из других таблиц стилей в единое дерево таблицы стилей. |
||
# Прочитать входные данные XML с помощью XML-парсера, перевести его содержимое в дерево узлов (''исходное дерево'') |
# Прочитать входные данные XML с помощью XML-парсера, перевести его содержимое в дерево узлов (''исходное дерево'') согласно модели данных XPath. XML-документ может ссылаться на другие XML-источники с помощью вызова функций <code>document()</code>. Эти вызовы обычно обрабатываются во время выполнения, так как их расположение может являться вычисляемым, а вызовы соответствующих функций могут не происходить вовсе (пример выше не ссылается на какие-либо другие документы). |
||
# Удалить пустые узлы из таблицы стилей XSLT, кроме тех, которые являются потомками |
# Удалить пустые узлы из таблицы стилей XSLT, кроме тех, которые являются потомками элементов <code>xsl:text</code>. Это позволяет исключить появление «лишних» пробелов. |
||
# Удалить пустые текстовые узлы из исходного дерева, если инструкции <code>xsl:strip-space</code> присутствуют в исходном документе. Это позволяет исключить появление «лишних» пробелов |
# Удалить пустые текстовые узлы из исходного дерева, если инструкции <code>xsl:strip-space</code> присутствуют в исходном документе. Это позволяет исключить появление «лишних» пробелов (пример выше не использует эту возможность). |
||
# Пополнить XSLT-дерево тремя правилами, которые предоставляют поведение по умолчанию для любых типов узлов, которые могут быть встречены при обработке. Первое правило — для обработки ''корневого узла''; оно даёт инструкцию процессору обработать каждого потомка корневого узла. Второе правило — для любых ''текстовых узлов'' или ''узлов атрибутов''; он даёт команду процессору сделать копию этого узла в результирующем дереве. Третье правило — для всех ''узлов комментария'' и ''узлов-инструкций обработки''; никакой операции не производится. Шаблоны, явно заданные в XSLT, могут перекрывать часть или все шаблоны-правила, заданные по умолчанию. Если шаблон не содержит явных правил, встроенные правила будут применены для рекурсивного обхода исходного дерева и только текстовые узлы будут скопированы в результирующее дерево (узлы атрибутов не будут достигнуты, так как они не являются «детьми» их родительских узлов). Полученный таким образом результат обычно нежелателен, так как он является просто конкатенацией всех текстовых фрагментов из исходного XML-документа. |
# Пополнить XSLT-дерево тремя правилами, которые предоставляют поведение по умолчанию для любых типов узлов, которые могут быть встречены при обработке. Первое правило — для обработки ''корневого узла''; оно даёт инструкцию процессору обработать каждого потомка корневого узла. Второе правило — для любых ''текстовых узлов'' или ''узлов атрибутов''; он даёт команду процессору сделать копию этого узла в результирующем дереве. Третье правило — для всех ''узлов комментария'' и ''узлов-инструкций обработки''; никакой операции не производится. Шаблоны, явно заданные в XSLT, могут перекрывать часть или все шаблоны-правила, заданные по умолчанию. Если шаблон не содержит явных правил, встроенные правила будут применены для рекурсивного обхода исходного дерева и только текстовые узлы будут скопированы в результирующее дерево (узлы атрибутов не будут достигнуты, так как они не являются «детьми» их родительских узлов). Полученный таким образом результат обычно нежелателен, так как он является просто конкатенацией всех текстовых фрагментов из исходного XML-документа. |
||
Затем процессор проделывает следующие шаги для получения и сериализации результирующего дерева |
Затем процессор проделывает следующие шаги для получения и сериализации результирующего дерева. |
||
# Создаёт корневой узел результирующего дерева. |
# Создаёт корневой узел результирующего дерева. |
||
# Обрабатывает корневой узел исходного дерева. Процедура обработки узла описана ниже. |
# Обрабатывает корневой узел исходного дерева. Процедура обработки узла описана ниже. |
||
# Сериализует результирующее дерево, если необходимо, согласно подсказкам, описанным инструкцией <code>xsl:output</code>. |
# Сериализует результирующее дерево, если необходимо, согласно подсказкам, описанным инструкцией <code>xsl:output</code>. |
||
При обработке узла производятся следующие действия |
При обработке узла производятся следующие действия. |
||
# Производится поиск наиболее подходящего шаблона правила. Это достигается проверкой соответствия ''шаблона'' (который является выражением XPath) для каждого правила, указывая узлы, для которых правило может быть применено. Каждому шаблону процессором назначается относительный ''приоритет'' и ''старшинство'' для облегчения разрешения конфликтов. Порядок шаблонных правил в таблице стилей также может помочь разрешению конфликтов между шаблонами, которые соответствуют одинаковым узлам, но это не оказывает влияния на порядок, в котором узлы будут обрабатываться. |
# Производится поиск наиболее подходящего шаблона правила. Это достигается проверкой соответствия ''шаблона'' (который является выражением XPath) для каждого правила, указывая узлы, для которых правило может быть применено. Каждому шаблону процессором назначается относительный ''приоритет'' и ''старшинство'' для облегчения разрешения конфликтов. Порядок шаблонных правил в таблице стилей также может помочь разрешению конфликтов между шаблонами, которые соответствуют одинаковым узлам, но это не оказывает влияния на порядок, в котором узлы будут обрабатываться. |
||
# Template rule contents are instantiated. Элементы в пространстве имён XSLT (обычно имеющие префикс <code>xsl:</code>) трактуются как ''инструкции'' и имеют специальную семантику, которая указывает на то, как они должны интерпретироваться. Одни предназначены для добавления узлов в результирующее дерево, другие являются управляющими конструкциями. Не XSLT-элементы и текстовые узлы, обнаруженные в правиле, копируются, «дословно», в результирующее дерево. Комментарии и управляющие инструкции игнорируются. |
# Template rule contents are instantiated. Элементы в пространстве имён XSLT (обычно имеющие префикс <code>xsl:</code>) трактуются как ''инструкции'' и имеют специальную семантику, которая указывает на то, как они должны интерпретироваться. Одни предназначены для добавления узлов в результирующее дерево, другие являются управляющими конструкциями. Не XSLT-элементы и текстовые узлы, обнаруженные в правиле, копируются, «дословно», в результирующее дерево. Комментарии и управляющие инструкции игнорируются. |
||
Строка 287: | Строка 290: | ||
Инструкция <code>xsl:apply-templates</code> при её обработке приводит к выборке и обработке нового набора узлов. Узлы идентифицируются с помощью выражения XPath. Все узлы обрабатываются в том порядке, в котором они содержатся в исходном документе. |
Инструкция <code>xsl:apply-templates</code> при её обработке приводит к выборке и обработке нового набора узлов. Узлы идентифицируются с помощью выражения XPath. Все узлы обрабатываются в том порядке, в котором они содержатся в исходном документе. |
||
XSLT расширяет библиотеку функций |
XSLT расширяет библиотеку функций XPath и позволяет определять XPath-переменные. Эти переменные имеют разную область видимости в таблице стилей, в зависимости от того, где они были определены и их значения могут задаваться за пределами таблицы стилей. Значения переменных не могут быть изменены во время обработки. |
||
Хотя эта процедура может показаться сложной, |
Хотя эта процедура может показаться сложной, она делает XSLT по возможностям похожей на другие языки web-шаблонов. Если таблица стилей состоит из единственного правила, предназначенного для обработки корневого узла, в результат просто копируется всё содержимое шаблона, а XSLT-инструкции (элементы '<code>xsl:…</code>') заменяются вычисляемым содержимым. XSLT предлагает даже специальный формат («literal result element as stylesheet») для таких простых, одношаблонных трансформаций. Однако, возможность определять отдельные шаблоны и правила сильно увеличивает гибкость и эффективность XSLT, особенно при генерации результата, который очень похож на исходный документ. |
||
== См. также == |
== См. также == |
||
Строка 333: | Строка 336: | ||
|isbn = 978-5-9775-0292-4 |
|isbn = 978-5-9775-0292-4 |
||
|тираж = |
|тираж = |
||
}} |
|||
* {{книга |
|||
|автор = Кэй М. |
|||
|часть = |
|||
|заглавие = XSLT. Справочник программиста. 2-е издание |
|||
|оригинал = XSLT, Programmer’s Reference, 2nd Edition |
|||
|ответственный = |
|||
|издание = |
|||
|место = СПб |
|||
|издательство = [[Символ-Плюс]] |
|||
|год = 2002 |
|||
|том = |
|||
|страниц = 1016 |
|||
|серия = |
|||
|isbn = 5-93286-039-1 |
|||
|тираж = 2000 |
|||
}} |
|||
* |
|||
* {{книга |
|||
|автор = Холзнер С. |
|||
|часть = |
|||
|заглавие = XSLT. Библиотека программиста. 2-е издание |
|||
|оригинал = Inside XSLT |
|||
|ответственный = |
|||
|издание = |
|||
|место = СПб |
|||
|издательство = [[Питер (издательство)|Питер]] |
|||
|год = 2002 |
|||
|том = |
|||
|страниц = 544 |
|||
|серия = |
|||
|isbn = 5-94723-271-5 |
|||
|тираж = 3 |
|||
}} |
}} |
||
== Ссылки == |
== Ссылки == |
||
* [http://www.w3.org/TR/xslt XSLT 1.0. Рекомендация W3C] |
* [http://www.w3.org/TR/xslt XSLT 1.0. Рекомендация W3C]{{ref-en}} |
||
* [http://www.w3.org/TR/xslt20/ XSLT 2.0. Рекомендация W3C] |
* [http://www.w3.org/TR/xslt20/ XSLT 2.0. Рекомендация W3C]{{ref-en}} |
||
* [http://www.w3.org/TR/xslt-30/ XSLT 3.0. Рекомендация W3C]{{ref-en}} |
|||
* [http://zvon.org/xxl/XSLTutorial/Output_rus/index.htm Учебные материалы по XSLT на zvon.org] |
* [http://zvon.org/xxl/XSLTutorial/Output_rus/index.htm Учебные материалы по XSLT на zvon.org] |
||
* [http://xmlhack.ru/books/xslt/ Выдержки] из книги Алексея Валикова «[http://www.books.ru/shop/books/22090 Технология XSLT]». |
* [http://xmlhack.ru/books/xslt/ Выдержки] из книги Алексея Валикова «[http://www.books.ru/shop/books/22090 Технология XSLT]». |
||
* |
* {{cite web|url=http://www.raleigh.ru/XML/XSLTutorial/contents.htm|title=XSLT в примерах|subtitle=|author=|authorlink=|coauthors=|quote=|date=2002|format=|website=|publisher=|accessdate=|lang=|description=|deadlink=yes|archiveurl=https://archive.today/20130417091954/http://www.raleigh.ru/XML/XSLTutorial/contents.htm|archivedate=2013-04-17}} |
||
* [http://data2type.de/en/xml-xslt-xslfo/xslt/ XSLT introduction and reference] |
|||
{{rq|refless}} |
{{rq|refless}} |
Текущая версия от 02:12, 19 сентября 2024
XSLT | |
---|---|
Орган стандартизации | Консорциум Всемирной паутины |
Создатель | Консорциум Всемирной паутины |
Создан | 1999 |
Официальный сайт |
w3.org/TR/xslt w3.org/TR/xslt20/ w3.org/standards/xml/tra… |
Медиафайлы на Викискладе |
XSLT (eXtensible Stylesheet Language Transformations) — язык преобразования XML-документов. Спецификация XSLT входит в состав XSL и является рекомендацией W3C.
При применении таблицы стилей XSLT, состоящей из набора шаблонов, к XML-документу (исходное дерево) образуется конечное дерево, которое может быть сериализовано в виде XML-документа, XHTML-документа (только для XSLT 2.0), HTML-документа или простого текстового файла. Правила выбора (и, отчасти, преобразования) данных из исходного дерева пишутся на языке запросов XPath.
XSLT имеет множество различных применений, в основном в области веб-программирования и генерации отчётов. Одной из задач, решаемых языком XSLT, является отделение данных от их представления, как часть общей парадигмы MVC (англ. Model-view-controller). Другой стандартной задачей является преобразование XML-документов из одной XML-схемы в другую.
История
[править | править код]XSLT разработан рабочей группой XSL Консорциума Всемирной паутины.
Версия 1.0 была одобрена в качестве рекомендации 16 ноября 1999 года. После выхода первой версии начались работы над версией 1.1, но в 2001 году они были прекращены, а рабочая группа XSL присоединилась к рабочей группе XQuery для совместной работы над XPath 2.0. Впоследствии XPath 2.0 послужил основой при разработке XSLT версии 2.0.
Версия 2.0 была одобрена в качестве рекомендации 24 января 2007 года.
Версия 3.0 была одобрена 8 июня 2017 года.
Процесс выполнения XSLT-преобразования
[править | править код]В процессе выполнения XSLT-преобразования задействованы:
- один или несколько входных XML-документов;
- одна или несколько таблиц стилей XSLT;
- XSLT-процессор;
- один или несколько выходных документов.
В простейшем случае XSLT-процессор получает на входе два документа — входной XML-документ и таблицу стилей XSLT — и создаёт на их основе выходной документ.
XSLT и XPath
[править | править код]XSLT использует язык XPath для доступа к отдельным частям входного XML-документа и для организации вычислений.
XSLT 1.0 использует XPath 1.0, а XSLT 2.0 использует XPath 2.0.
Примеры
[править | править код]Трансформация из XML в XSLT
[править | править код]Исходный 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="persons">
<transform>
<xsl:apply-templates/>
</transform>
</xsl:template>
<xsl:template match="person">
<record>
<xsl:apply-templates select="@*|*"/>
</record>
</xsl:template>
<xsl:template match="@username">
<username>
<xsl:value-of select="."/>
</username>
</xsl:template>
<xsl:template match="name">
<fullname>
<xsl:apply-templates/>
<xsl:apply-templates select="following-sibling::surname" mode="fullname"/>
</fullname>
</xsl:template>
<xsl:template match="surname"/>
<xsl:template match="surname" mode="fullname">
<xsl:text> </xsl:text>
<xsl:apply-templates/>
</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>
Трансформация из XML в XHTML
[править | править код]Входной XML-документ:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="my-style.xsl"?>
<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-процессор разбирает файл преобразования и строит XML-дерево входного файла. Затем он ищет шаблон, который лучше всего подходит для корневого узла и вычисляет содержимое найденного шаблона. Инструкции в каждом шаблоне могут либо напрямую говорить XSLT-процессору «создай здесь такой-то тег» либо говорить «обработай другие узлы по тому же правилу, что и корневой узел».
Более подробно этот алгоритм, в чём-то нетривиальный, описывается ниже, хотя многие из его экзотических деталей опущены.
Каждый XSLT-процессор должен выполнить следующие шаги для подготовки к трансформации.
- Прочитать таблицу стилей XSLT с помощью XML-парсера и перевести его содержимое в дерево узлов (дерево таблицы стилей) согласно модели данных XPath. Синтаксические ошибки «времени компиляции» определяются на этой стадии. Таблицы стилей могут быть модульными, поэтому все включения (инструкции
xsl:include
,xsl:import
) также будут обработаны на этой стадии с целью объединить все шаблонные правила и иные элементы из других таблиц стилей в единое дерево таблицы стилей. - Прочитать входные данные XML с помощью XML-парсера, перевести его содержимое в дерево узлов (исходное дерево) согласно модели данных XPath. XML-документ может ссылаться на другие XML-источники с помощью вызова функций
document()
. Эти вызовы обычно обрабатываются во время выполнения, так как их расположение может являться вычисляемым, а вызовы соответствующих функций могут не происходить вовсе (пример выше не ссылается на какие-либо другие документы). - Удалить пустые узлы из таблицы стилей XSLT, кроме тех, которые являются потомками элементов
xsl:text
. Это позволяет исключить появление «лишних» пробелов. - Удалить пустые текстовые узлы из исходного дерева, если инструкции
xsl:strip-space
присутствуют в исходном документе. Это позволяет исключить появление «лишних» пробелов (пример выше не использует эту возможность). - Пополнить XSLT-дерево тремя правилами, которые предоставляют поведение по умолчанию для любых типов узлов, которые могут быть встречены при обработке. Первое правило — для обработки корневого узла; оно даёт инструкцию процессору обработать каждого потомка корневого узла. Второе правило — для любых текстовых узлов или узлов атрибутов; он даёт команду процессору сделать копию этого узла в результирующем дереве. Третье правило — для всех узлов комментария и узлов-инструкций обработки; никакой операции не производится. Шаблоны, явно заданные в XSLT, могут перекрывать часть или все шаблоны-правила, заданные по умолчанию. Если шаблон не содержит явных правил, встроенные правила будут применены для рекурсивного обхода исходного дерева и только текстовые узлы будут скопированы в результирующее дерево (узлы атрибутов не будут достигнуты, так как они не являются «детьми» их родительских узлов). Полученный таким образом результат обычно нежелателен, так как он является просто конкатенацией всех текстовых фрагментов из исходного XML-документа.
Затем процессор проделывает следующие шаги для получения и сериализации результирующего дерева.
- Создаёт корневой узел результирующего дерева.
- Обрабатывает корневой узел исходного дерева. Процедура обработки узла описана ниже.
- Сериализует результирующее дерево, если необходимо, согласно подсказкам, описанным инструкцией
xsl:output
.
При обработке узла производятся следующие действия.
- Производится поиск наиболее подходящего шаблона правила. Это достигается проверкой соответствия шаблона (который является выражением XPath) для каждого правила, указывая узлы, для которых правило может быть применено. Каждому шаблону процессором назначается относительный приоритет и старшинство для облегчения разрешения конфликтов. Порядок шаблонных правил в таблице стилей также может помочь разрешению конфликтов между шаблонами, которые соответствуют одинаковым узлам, но это не оказывает влияния на порядок, в котором узлы будут обрабатываться.
- Template rule contents are instantiated. Элементы в пространстве имён XSLT (обычно имеющие префикс
xsl:
) трактуются как инструкции и имеют специальную семантику, которая указывает на то, как они должны интерпретироваться. Одни предназначены для добавления узлов в результирующее дерево, другие являются управляющими конструкциями. Не XSLT-элементы и текстовые узлы, обнаруженные в правиле, копируются, «дословно», в результирующее дерево. Комментарии и управляющие инструкции игнорируются.
Инструкция xsl:apply-templates
при её обработке приводит к выборке и обработке нового набора узлов. Узлы идентифицируются с помощью выражения XPath. Все узлы обрабатываются в том порядке, в котором они содержатся в исходном документе.
XSLT расширяет библиотеку функций XPath и позволяет определять XPath-переменные. Эти переменные имеют разную область видимости в таблице стилей, в зависимости от того, где они были определены и их значения могут задаваться за пределами таблицы стилей. Значения переменных не могут быть изменены во время обработки.
Хотя эта процедура может показаться сложной, она делает XSLT по возможностям похожей на другие языки web-шаблонов. Если таблица стилей состоит из единственного правила, предназначенного для обработки корневого узла, в результат просто копируется всё содержимое шаблона, а XSLT-инструкции (элементы 'xsl:…
') заменяются вычисляемым содержимым. XSLT предлагает даже специальный формат («literal result element as stylesheet») для таких простых, одношаблонных трансформаций. Однако, возможность определять отдельные шаблоны и правила сильно увеличивает гибкость и эффективность XSLT, особенно при генерации результата, который очень похож на исходный документ.
См. также
[править | править код]Литература
[править | править код]- Тидуэлл Д. XSLT. 2-е издание = XSLT, 2nd Edition. — СПб.: Символ-Плюс, 2009. — 960 с. — 1200 экз. — ISBN 978-5-93286-150-9.
- Мангано С. XSLT. Сборник рецептов = XSLT Cookbook: Solutions and Examples for XML and XSLT Developers, 2nd Edition. — СПб.: BHV, 2008. — 864 с. — ISBN 978-5-9775-0292-4.
- Кэй М. XSLT. Справочник программиста. 2-е издание = XSLT, Programmer’s Reference, 2nd Edition. — СПб.: Символ-Плюс, 2002. — 1016 с. — 2000 экз. — ISBN 5-93286-039-1.
- Холзнер С. XSLT. Библиотека программиста. 2-е издание = Inside XSLT. — СПб.: Питер, 2002. — 544 с. — 3 экз. — ISBN 5-94723-271-5.
Ссылки
[править | править код]- XSLT 1.0. Рекомендация W3C (англ.)
- XSLT 2.0. Рекомендация W3C (англ.)
- XSLT 3.0. Рекомендация W3C (англ.)
- Учебные материалы по XSLT на zvon.org
- Выдержки из книги Алексея Валикова «Технология XSLT».
- XSLT в примерах (2002). Архивировано из оригинала 17 апреля 2013 года.
- XSLT introduction and reference
Для улучшения этой статьи желательно:
|