XSLT
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-преобразования задействованы:
В простейшем случае XSLT-процессор получает на входе два документа — входной XML-документ и таблицу стилей XSLT — и создаёт на их основе выходной документ. XSLT и XPathXSLT использует язык 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 расширяет библиотеку функций XPath и позволяет определять XPath-переменные. Эти переменные имеют разную область видимости в таблице стилей, в зависимости от того, где они были определены и их значения могут задаваться за пределами таблицы стилей. Значения переменных не могут быть изменены во время обработки. Хотя эта процедура может показаться сложной, она делает XSLT по возможностям похожей на другие языки web-шаблонов. Если таблица стилей состоит из единственного правила, предназначенного для обработки корневого узла, в результат просто копируется всё содержимое шаблона, а XSLT-инструкции (элементы ' См. такжеЛитература
Ссылки
|
Portal di Ensiklopedia Dunia