- Xslt
-
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)
- Прочитать таблицу стилей 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-элементы и текстовые узлы, обнаруженные в правиле, копируются, «дословно», в результирующее дерево. Комментарии и управляющие инструкции игнорируются. - W3C
- XSL
- XSL-FO
-
Ссылки
- http://w3.org/Style/XSL/
- Перевод W3C Рекомендаций на русский язык
- Учебные материалы по XSLT на zvon.org
- Выдержки из книги Алексея Валикова «Технология XSLT».
- Язык преобразований XSL (XSLT)Версия 1.0 (рус.)
Стандарты Консорциума Всемирной паутины Рекомендации W3C CDF · · CSS · · · · OWL · RDF · RDF Schema · SISR · · · SRGS · SSML · · Timed Text · VoiceXML · · · · · · XML Base · XML Events · XML Information Set · XML Schema · · · · · · XSLT · Примечания XHTML+SMIL Рабочие проекты CCXML · CURIE · InkML · XFrames · XFDL · WICD · XHTML+MathML+SVG
Wikimedia Foundation. 2010.
Таблица 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-процессор должен выполнить следующие шаги для подготовки к трансформации:
Затем процессор проделывает следующие шаги для получения и сериализации результирующего дерева:
При обработке узла прозводятся следующие действия:
Инструкция xsl:apply-templates
при её обработке приводит к выборке и обработке нового набора узлов. Узлы идентифицируются с помощью выражения XPath. Все узлы обрабатываются в том порядке, в котором они содержатся в исходном документе.
XSLT расширяет библиотеку функций XPath’s и позволяет определять XPath-переменные. Эти переменные имеют разную область видимости в таблице стилей, в зависимости от того, где они были определены и их значения могут задаваться за пределами таблицы стилей. Значения переменных не могут быть изменены во время обработки.
Хотя эта процедура может показаться сложной, однако она делает XSLT по возможностям похожей на другие языки web-шаблонов. Если таблица стилей состоит из единственного правила, предназначенного для обработки корневого узла, в результат просто копируется всё содержимое шаблона, а XSLT-инструкции (элементы 'xsl:…
') заменяются вычисляемым содержимым. XSLT предлагает даже специальный формат («literal result element as stylesheet») для таких простых, одношаблонных трансформаций. Однако, возможность определять отдельные шаблоны и правила сильно увеличивает гибкость и эффективность XSLT, особенно при генерации результата, который очень похож на исходный документ.