69060

Языки XSLT. Связывание документов XML с таблицами стилей

Лекция

Информатика, кибернетика и программирование

Наиболее простым способом форматированного вывода документов XML в Web-браузерах является связывание документа XML с внешними таблицами стилей. Для такого связывания в спецификации W3 «Связывание таблиц стилей с документами XML (Associating Style Sheets with XML documents)»...

Русский

2014-09-29

300.5 KB

3 чел.

 27

Лекция 4-08

Тема 5.3. Языки XSLT и XSL

5.3.1. Связывание документов XML с таблицами стилей

5.3.2. Язык XSL и его компоненты

5.3.3. Преобразование документа с помощью XSLT

 5.3.3.1. Технология преобразования

 5.3.3.2. Процессоры XSLT

5.3.4. Структура документа XSLT

 5.3.4.1. Пространство имен XSLT

 5.3.4.2. Корневые элементы и элементы верхнего уровня документа XSLT

 5.3.4.3. Условное включение элемента

 5.3.4.4. Модульная структура преобразований XSLT

 5.3.4.4.1. Включение внешних файлов

 5.3.4.4.2. Импорт внешних файлов

 5.3.4.4.3. Использование сущностей

 5.3.4.4.4. Импорт схем

5.3.5. Совместное использование преобразований и документов XML

5.3.6. Управление выводом в XSLT

 5.3.6.1. Элемент xsl:output

 5.3.6.2. Метод вывода "xml"

 5.3.6.3. Метод вывода "xhtml"

 5.3.6.4. Метод вывода "html"

 5.3.6.5. Метод вывода "text"

5.3.7. Правила шаблона в XSLT

 5.3.7.1. Образцы и шаблоны

 5.3.7.2. Объявление шаблона

 5.3.7.3. Вызов неименованных правил шаблона 

 5.3.7.4. Упрощенные преобразования

5.3.8. Создание узлов элементов и атрибутов в XSLT

 5.3.8.1. Элемент xsl:element

 5.3.8.2. Элемент xsl:attribute

 5.3.8.3. Элемент xsl:attribute-set

Тема 5.3. Языки XSLT и XSL

5.3.1. Связывание документов XML с таблицами стилей

Наиболее простым способом форматированного вывода документов XML в Web-браузерах является связывание документа XML с внешними таблицами стилей.

Для такого связывания в спецификации W3 «Связывание таблиц стилей с документами XML (Associating Style Sheets with XML documents)» введена инструкция по обработке xml-stylesheet. Эта инструкция помещается в прологе документа XML и имеет следующий формат:

<?xml-stylesheet href="URL" type="text/css" [title="имя"]

[media="среда-вывода"]  [charset="кодировка-таблицы"]

[alternate="yes | no"]?> 

Псевдоатрибут href в инструкции задает местонахождение таблицы стилей, а псевдоатрибут type – тип таблицы (его значение всегда "text/css"). Псевдоатрибут title задает имя таблицы стилей, псевдоатрибут media – среду вывода документа (например, "screen" или "print"), а псевдоатрибут charset – кодировку таблицы стилей (например, "Windows-1251"). Псевдоатрибут определяет, является ли таблица альтернативной, т.е. имеет то же значение атрибута title (у альтернативных таблиц должны отличаться значения псевдоатрибута media и/или charset). По умолчанию значение псевдоатрибута alternate равно no.

Пример задания альтернативных таблиц:

<?xml-stylesheet alternate="yes" title="compact"

href="small.css" media="screen" type="text/css"?>

<?xml-stylesheet alternate="yes" title="compact"

href="small-extra.css" media="print" type="text/css"?>

 В качестве селекторов в таблицах стилей задаются имена элементов документа XML. Содержимое этих элементов будет выведено в Web-браузере (Internet Explorer или Netscape Navigator) в указанном формате.

Пусть задан следующий документ XML:

<?xml version="1.0" encoding="Windows-1251"?>

<?xml-stylesheet href="HTMLmessage.css" type="text/css"?>

<message>

<header>

<from>ivanov@mail.com</from>

<to>petrov@mail.com</to>

 <subject>Поздравление</subject>

</header>

<body>Поздравляю с днем рождения!</body>

</message>

Таблица стилей HTMLmessage.css для этого документа имеет следующий вид:

message {font-size: 12pt; font-family: Arial}

header {color: navy}

from, to {display: block; font-weight: bold;

text-indent: 40pt}

subject {display: block; color: brown}

body {display: block; text-indent: 10pt}

На экран Web-браузера будет выведено:

ivanov@mail.com 

petrov@mail.com 

Поздравление

Поздравляю с днем рождения!

Возможности таблиц стилей по форматированному выводу документов XML очень ограничены, поскольку Web-браузер выводит только текстовое содержимое элементов и не «видит» в документе XML ни пустых элементов, ни атрибутов элементов. Более широкие возможности предоставляет использование языка преобразования для расширенных таблиц стилей – XSLT, который будет рассмотрен далее.

5.3.2. Язык XSL и его компоненты  

Как уже говорилось, язык XML описывает структуру документа, но не говорит о том, как этот документ должен быть обработан или отображен. Выше рассмотрены два средства для решения этих задач: использование инструкции по обработке xml-stylesheet для вывода документа с помощью каскадных таблиц стилей CSS и использование  средств SAX и DOM. Первое средство предоставляет очень ограниченные возможности по стилевому оформлению документа, а второе требует написания программ вывода документа XML на языках JavaScript или Java.  

Аналогичная проблема в языке SGML – родителе языка XML, была решена с помощью создания языка семантики и описания стиля документа DSSSL (Document Style Semantics And Specification Language). Поскольку XML является подмножеством SGML, язык DSSSL можно использовать и для документов XML, например,  для преобразования документа XML с одним DTD в документ XML с другим DTD или форматированного вывода документа XML. Как и сам язык SGML, язык DSSSL является мощным, но в тоже время очень сложным средством. Поэтому консорциум W3 разработал свое средство для форматированного вывода документов XML – расширяемый язык стилей XSL (Extensible Stylesheet Language).

Первоначально предполагалось, что задача форматирования документа XML будет решена с использованием только языка XSL. Однако при разработке спецификации этого языка выяснилось, что процесс форматирования документа XML разбивается на два этапа.

На первом этапе выполняется преобразование исходного документа XML, точнее его иерархического представления, в другое иерархическое представление с возможным изменением структуры документа для его форматирования. Так, например, в документ XML может быть добавлено оглавление или сделана выборка их документа по какому-либо критерию.

На втором этапе к узлам полученной иерархической структуры, которые называются объектами форматирования – FO (Format Objects), применяются стили форматирования на уровне всего документа, его отдельных страниц и элементов (абзацев, фрагментов абзацев, изображений, таблиц, списков и т.д.).

Поэтому в настоящее время язык XSL описан в двух отдельных спецификациях. Первая спецификация – язык  преобразований XSL – XSLT (XSL Transformation) версия 1.0, описывающая средства преобразования в XSL,  была принята в ноябре 1999 года. В январе 2007 года принята версия 2.0 этой спецификации, предназначенной для работы совместно с XPath 2.0.

Ниже рассматриваются средства и возможности языка XSLT, определенные в спецификации 2.0 (средства собственно языка XSL будут рассмотрены отдельно).

5.3.3. Преобразование документа с помощью XSLT

5.3.3.1. Технология преобразования

В общем случае в преобразовании участвуют три документа:

  •  входной документ, над которым выполняется преобразование (документ XML);
  •  входной документ, описывающий преобразование (документ XSLT);
  •  выходной документ – результат преобразования.

Процесс преобразования входного документа в соответствии с описанными правилами называется применением преобразования к входному документу или просто выполнением преобразования. Это выполнение осуществляют специальные программы, которые называются процессорами XSLT.

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

Процессор XSLT выполняет операции на исходным документом XML в три этапа:

  •  этап анализа;
  •  этап преобразования;
  •  этап сериализации.

На этапе анализа процессор XSLT преобразует входные текстовые документы в их иерархическое представление (рис. 5.3.1). В спецификации определены два типа процессоров XSLT: процессоры без использования схемы и процессоры с использованием схемы. Последний тип проверяет  действительность документа, т.е. его соответствие своей схеме. При  анализе входных документов обычно используется встроенный или внешний SAX-анализатор или DOM-анализатор.

Рис. 5.3.1. Анализ и преобразование входных документов

в иерархические структуры

 

На этапе преобразования процессор XSLT применяет правила преобразования, описанные в документе XSLT, к иерархической структуре входного документа XML. В результате преобразования  получается иерархическая структура выходного документа (рис. 5.3.2).

Рис. 5.3.2. Преобразование документа XML процессором XSLT

На этапе сериализации полученная структура выходного документа представляется  в текстовой форме заданного вида, которая может быть записана в файл или выведена на экран.

Спецификация XSLT 2.0 определяет четыре обязательных вида сериализации, которые должен поддерживать процессор XSLT: документ XML, документ HTML,   документ XHTML и чисто текстовый документ, не содержащий элементов разметки.

Конкретная реализация процессора XSLT может поддерживать и другие виды сериализации, например, формат Word или формат PDF.

Этап сериализации показан на рис. 5.3.3.

Рис. 5.3.3. Сериализация структуры выходного документа процессором XSLT

В отличие от языка схем, спецификация языка XSLT позволяет вводить собственные функции и элементы и использовать их в преобразованиях. Однако использование расширений может привести к потере переносимости при выполнении преобразований на различных компьютерных платформах.

Расширения можно создавать на различных языках программирования, но наиболее часто используется язык Java, поскольку в нем есть средства, облегчающие разработку новых элементов и функций.

5.3.3.2. Процессоры XSLT

Процессор XSLT может быть как самостоятельным приложением, либо частью приложения, выполняющего обработку документов XML.

Описанные выше средства выполнения преобразований документов XML в языке Java позволяют написать собственный процессор XSLT, который можно вставить в любую программу обработки документов XML.

Для случая, когда исходный документ XML и таблица стилей XSL находятся в файле и преобразованный документ также выводится в файл, фрагмент программы преобразования будет иметь следующий вид:

File xmlFile = new File (имя-файла-XML); 

File xsltFile = new File(имя-файла-XSL);

Source xmlSource = new StreamSource(xmlFile);

Source xsltSource = new StreamSource(xsltFile);

try {

result = new StreamResult(

new FileOutputStream(имя-выходного-файла)

);

}

catch(IOException e) {

System.out.println("I/O Error:" + e.toString());

}

TransformerFactory transFact =

TransformerFactory.newInstance();

Transformer trans =

transFact.newTransformer(xsltSource);

trans.setOutputProperty(OutputKeys.ENCODING,

"windows-1251");

trans.transform(xmlSource, result);

Существует множество готовых процессоров XSLT, которые можно использовать как отдельно, так и в составе разрабатываемых приложений. Основными критериями выбора  процессора XSLT  являются:

  •  поддерживаемые программные или языковые платформы;
  •  поддержка расширений;
  •  полнота реализации;
  •  скорость.

Наиболее популярными свободно распространяемыми процессорами XSLT являются:

  •  процессор MSXML (Microsoft XML Core Services);
  •  процессор Xalan (разработчик Apache XML Project);
  •  процессор Saxon (разработчик Майкл Кей).

Процессор MSXML (последняя версия 6.0) разработан для платформы MS Windows. В состав MSXML, помимо процессора XSLT версии 1.0 входят также SAX-анализатор, DOM-анализатор и некоторые другие компоненты. Этот процессор встроен в Internet Explorer, и, кроме того, может использоваться отдельно в виде утилиты командной строки msxsl.exe, которая вызывается следующим образом:

msxsl.exe файл-XML  файл-XSLT  выходной-файл

Процессор MSXML поддерживает пользовательские функции расширения, которые могут быть написаны на языках сценариев VBScript и JScript и включены непосредственно в сами преобразования.

Процессор Xalan создан в двух вариантах: для языковых платформ Java и C++. Он поставляется с открытым исходным кодом и открытым API, что делает возможным его  интеграцию в другие приложения. Процессор Xalan Java поддерживает набор интерфейсов TrAX (Transformation API for XML – программный интерфейс преобразований для XML), определяющий стандартные модели и методы преобразования документов XML в программах на языке Java.  Процессор Xalan Java так же можно запускать из командной строки с помощью команды:

java -jar xalan.jar org.apache.xalan.xslt.Process

-in файл-XML -xsl файл-XSLT -out выходной-файл 

Процессор Xalan Java, как и Xalan C++, реализует дополнительную библиотеку функций (которая по сравнению с Xalan C++ также намного шире). Помимо этого, Xalan Java позволяет создавать функции и элементы расширения на Java и других языках программирования.

Процессор Saxon, так же как и Xalan, является бесплатным продуктом с открытым кодом. Процессор Saxon поддерживает TrAX, а также позволяет применять пользовательские анализаторы и сериализаторы и предоставляет API для Java. Так же, как и рассмотренные выше процессоры XSLT, его можно запускать из командной строки с помощью команды:

java -jar saxon.jar  -о выходной-файл файл-XML файл-XSLT.

Расширения для Saxon могут быть созданы на языке Java в виде функций и элементов.

Кроме того, последние версии процессора Saxon поддерживают многие черты спецификации XSLT 2.0 (автор этого процессора является редактором спецификации XSLT 2.0).

В пакете программ XMLSpy практически полностью реализована спецификация XSLT 2.0, а также спецификация XPath 2.0.

5.3.4. Структура документа XSLT

5.3.4.1. Пространство имен XSLT

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

Уникальный идентификатор ресурса пространства имен XSLT имеет следующий вид:

http://www.w3.org/1999/XSL/Transform

Общепринятым префиксом пространства имен языка XSLT является префикс xsl. Таким образом, объявление пространства имен XSLT в общем случае будет выглядеть следующим образом:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

Помимо элементов языка в документе XSLT могут быть заданы следующие компоненты:

  •  функции языка XPath 2.0 (идентификатор ресурса пространства имен – http://www.w3.org/2005/xpath-functions, префикс – fn);
  •  данные языка XPath 2.0 (идентификатор ресурса пространства имен – http://www.w3.org/2005/xpath-datatypes, префикс – xdt);
  •  элементы схемы XML (идентификатор ресурса пространства имен – http://www.w3.org/2001/XMLSchema, префикс – xs);
  •  встроенные атрибуты схемы XML (идентификатор ресурса пространства имен – http://www.w3.org/2001/XMLSchema-instance, префикс – xsi);
  •  специальные атрибуты XML: xml:lang, xml:space и xml:id (идентификатор ресурса пространства имен – http://www.w3.org/XML/1998/namespace, префикс – xml).  

Поскольку спецификацией XSLT допустимы расширения языка, то для компонент расширений также необходимо задавать свои пространства имен.

5.3.4.2. Корневые элементы и элементы верхнего уровня документа XSLT

За исключением случаев упрощенных преобразований, корневым элементом документа XSLT всегда является элемент xsl:stylesheet или его синоним xsl:transform. Эти элементы имеют следующий синтаксис:

<xsl:stylesheet

id="идентификатор"

extension-element-prefixes="префиксы"

exclude-result-prefixes="префиксы"

version

xpath-default-namespace="URI"

default-validation = "preserve" | "strip"

default-collation="список-URI"

input-type-annotations = "preserve" | "strip" |

"unspecified"

>

 <!--

 Содержимое: элементы xsl:import, элементы верхнего уровня

 -->

</xsl:stylesheet>

<xsl:transform

id="идентификатор"

extension-element-prefixes="префиксы"

exclude-result-prefixes="префиксы"

version="число"

xpath-default-namespace="URI"

default-validation="preserve" | "strip"

default-collation="список-URI"

input-type-annotations="preserve" | "strip" |

 "unspecified"

>

 <!--

 Содержимое: элементы xsl:import, элементы верхнего уровня

 -->

</xsl:transform>

Элементы xsl:stylesheet и xsl:transform имеют обязательный атрибут version, в котором указывается версия языка, использованная при создании этого преобразования (допустимыми являются значения 1.0 или 2.0).

Необязательный атрибут id может содержать уникальный идентификатор данного преобразования. Этот атрибут используется в тех случаях, когда преобразование включено в преобразуемый документ для его идентификации внутри этого документа.

Необязательный атрибут extension-element-prefixes перечисляет префиксы пространств имен, которые определяют элементы расширения.

Необязательный атрибут exclude-result-prefixes перечисляет префиксы пространств имен, определения которых не нужно включать в выходной документ.

Необязательный атрибут xpath-default-namespace задает пространство имен для элементов и типов  данных, используемых в выражениях XPath при преобразовании данных, а также в некоторых других случаях, например в выражениях шаблонов. При задании  этого атрибута соответствующие элементы и типы  данных записываются выражениях XPath без префикса.

Необязательный атрибут default-validation задает значение по умолчанию атрибута validation в инструкциях xsl:document, xsl:element, xsl:attribute, xsl:copy, xsl:copy-of и xsl:result-document, а также значение по умолчанию атрибута xsl:validation во всех литеральных элементах результирующей структуры документа. Если для атрибута default-validation задано значение "strip" (это значение по умолчанию), то проверка соответствия документа своей схеме, т.е. проверка действительности документа, пропускается. Если  задано значение "preserve", такая проверка выполняется.

Необязательный атрибут default-collation задает правила по умолчанию для сравнения данных в выражениях XPath преобразования. Значением этого атрибута является список разделенных пробелами URI, содержащих соответствующие правила сравнения.

Необязательный атрибут input-type-annotations задает правило сохранения типов данных исходного документа в выходном документе. Иногда необходимо, чтобы структура выходного документа была одинаковой, независимо от того, проверялся ли входной документ на соответствие своей схеме или нет. Для этого необходимо заменить типы всех элементов на xsl:untyped, а типы всех атрибутов на xsl:untypedAtomic.  Такое изменение выполняется, если для атрибута input-type-annotations задано значение "strip". Если  задано значение "preserve", типы данных сохраняются. По умолчанию атрибут имеет значение "unspecified", т.е. изменение типа данных не определено.

Элементы верхнего уровня делятся на две категории: объявления (определены в пространстве имен XSLT) и элементы, определенные пользователем в других пространствах имен.

На верхнем уровне можно использовать следующие объявления:

  •  xsl:import;
  •  xsl:import-schema;
  •  xsl:include;
  •  xsl:strip-space;
  •  xsl:preserve-space;
  •  xsl:output;
  •  xsl:key;
  •  xsl:decimal-format;
  •  xsl:namespace-alias;
  •  xsl:attribute-set;
  •  xsl:character-map;
  •  xsl:variable;
  •  xsl:function;
  •  xsl:param;
  •  xsl:template.

Все перечисленные элементы кроме xsl:variable и xsl:param должны находиться только на верхнем уровне. Элементы xsl:variable и xsl:param могут использоваться как объявления (на верхнем уровне), так и в качестве инструкций в шаблонах, определяя локальные переменные и параметры.

Если преобразование импортирует внешние модули, первыми дочерними элементами xsl:stylesheet (xsl:transform) должны быть элементы xsl:import. Порядок всех остальных дочерних элементов xsl:stylesheet (xsl:transform) не имеет значения.

5.3.4.3. Условное включение элемента

Любой элемент языка XSLT может иметь атрибут use-when, значением которого является выражение XPath. Если атрибут задан для какого либо элемента и результат вычисления выражения XPath равен false,  этот элемент и все элементы, для которых данный элемент является предком, исключаются из преобразования.

Пример задания атрибута use-when:

<xsl:import-schema

 schema-location="http://mysite.com/schema"

 use-when="system-property('xsl:is-schema-aware')='yes'"/>

Схема по адресу "http://example.com/schema" не будет импортирована, если системное свойство "xsl:is-schema-aware" не равно "yes".

5.3.4.4. Модульная структура преобразований XSLT

Как и любой, достаточно развитый язык программирования, XSLT обладает средствами для организации модульной структуры преобразований. Существуют два основных способа использования в преобразованиях внешних модулей – включение и импорт. Кроме того, поскольку преобразования в XSLT также являются документами XML, для разбиения их на модули можно применять сущности.

5.3.4.4.1. Включение внешних файлов

Для включения внешних файлов в преобразования в XSLT можно использовать элемент-объявление xsl:include, который имеет следующий синтаксис:

 

<xsl:include 

 href = "URI"

/>

Обязательный атрибут href элемента xsl:include содержит URI внешнего модуля, который должен быть включен в текущее преобразование.

Внешний модуль соответствовать правилам синтаксиса языка XSLT.

При включении модуля вместо элемента xsl:include подставляется содержимое внешнего модуля. В свою очередь, во внешнем модуле также могут содержаться элементы xsl:include, однако рекурсивные вызовы, т.е. прямые и косвенные включения в вызванном модуле вызвавшего модуля, недопустимы.

Все ссылки и относительные URI, используемые во включаемом внешнем модуле, вычисляются относительно его базового адреса.  

Пример использования элемента xsl:include:

<xsl:include href="auxstyles.xsl"/>

5.3.4.4.2. Импорт внешних файлов

Другим способом использования внешних модулей в XSLT является импорт внешних файлов, который обеспечивается элементом xsl:import. Этот элемент имеет следующий синтаксис:

<xsl:import 

 href="URI"

/>

Импорт внешних файлов выполняется так же, как и включение файлов, однако он имеет следующие особенности:

  •  элементы xsl:import должны быть первыми дочерними элементами элемента xsl:stylesheet;
  •  порядок следования  элементов xsl:import оказывает влияние на приоритет операций преобразования.

Если одни и те же преобразования заданы в документе XSLT и внешних модулях, включаемых с помощью элементов xsl:include и xsl:import, то действуют следующие правила приоритета:

  •  наивысший приоритет имеют преобразования в документе XSLT и во включаемых внешних файлах;
  •  приоритет преобразования в импортируемом внешнем файле ниже, чем преобразования в документе XSLT и во включаемых внешних файлах;
  •  если в импортируемых внешних файлах задано одно и то же преобразование, то больший приоритет имеет преобразование, которое определено в последнем из импортируемых файлов с одинаковыми преобразованиями;
  •  если в импортируемом внешнем файле задан импорт другого внешнего файла, содержащего то же преобразование,  то больший приоритет имеет преобразование, которое определено в вызывающем импорт внешнем файле.

Чтобы изменить приведенные выше правила используются элементы-инструкции xsl:apply-imports и xsl:next-match, которые имеют следующий синтаксис:

<xsl:apply-imports>

  <!--

 Содержимое: элементы xsl:with-param

 -->

</xsl:apply-imports>

<xsl:next-match>

  <!--

 Содержимое: элементы xsl:with-param

 -->

</xsl:next-match>

Элемент xsl:apply-imports используется для изменения правил приоритета в импортируемых стилях, а элемент xsl:next-match – для изменения правил приоритета во всех остальных случаях. Оба элемента выбирают  преобразование, приоритет которого ниже, чем приоритет текущего преобразование (преобразование называется текущим, если оно имеет наивысший приоритет).

Элементы xsl:with-param в содержимом элементов xsl:apply-imports и xsl:next-match задают параметры для выбранного преобразования.

Пример использования элемента xsl:import:

<xsl:import href="styles1.xsl"/>

5.3.4.4.3. Использование сущностей 

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

Пример включения внешнего преобразования как сущности:

<!DOCTYPE xsl:stylesheet [

<!ENTITY extStyle SYSTEM "ext.xsl">

]>

<xsl:stylesheet

version="2.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

…                                                      

&extStyle;

</xsl:stylesheet>

В этом примере содержимое файла ext.xsl будет вставлено в преобразование вместо ссылки на сущность.

5.3.4.4.4. Импорт схем

Для процессоров XSLT с использованием схемы для идентификации компонент схемы используется элемент-объявление xsl:import-schema, который имеет следующий синтаксис:

<xsl:import-schema

namespace="ссылка-на URI"

schema-location="ссылка-на-URI"

>

 <!--

 Содержимое: xs:schema

 -->

</xsl:import-schema>

Необязательный атрибут namespace задает ссылку на пространство имен для импортируемых компонент схемы, а необязательный атрибут schema-location задает ссылку на схему.

В объявлении import-schema в качестве содержимого элемента может быть задана схема с корневым элементом xs:schema (в этом случае атрибут schema-location задавать не надо).

Примеры использования элемента xsl:import-schema:

1. Вызов внешней схемы:

<xsl:import-schema namespace="xs"

schema-location="http://mysyte.org/schemas/schema1.xs">

2. Создание пользовательского простого типа по перечислению на основе типа xs:string:

<xsl:import-schema>

  <xs:schema targetNamespace="http://localhost/RGBColor"

    xmlns:xs="http://www.w3.org/2001/XMLSchema">

     <xs:simpleType name="local:RGBColor">

        <xs:restriction base="xs:string">

           <xs:enumeration value="red"/>

           <xs:enumeration value="green"/>

    <xs:enumeration value="blue"/>

        </xs:restriction>

     </xs:simpleType>

  </xs:schema>

</xsl:import-schema>

5.3.5. Совместное использование преобразований и документов XML

Включение преобразования в документ XML выполняется с помощью рассмотренной ранее инструкции по обработке xml-stylesheet, в которой для атрибута type задается значение  "text/xsl".

Инструкция xml-stylesheet может быть включена только в пролог документа, то есть она должна предшествовать корневому элементу.

Пример включения файла преобразования в документ XML:

<?xml-stylesheet type="text/xsl" href="message.xsl"?>

Включение операций преобразования, содержащихся в файле message.xsl, в документ message.xml.

Если преобразование документа выполняется в режиме командной строки одним из процессоров XSLT, то инструкцию xml-stylesheet в документе XML можно не задавать.

Преобразование XSLT чаще всего является самостоятельным документом XML. Однако преобразование может встроено и в сам документ XML, для которого выполняется преобразование.  

В этом случае в преобразовании (элементе xsl:stylesheet или xsl:transform) внутри документа должен быть обязательно задан атрибут id, а в инструкции xml-stylesheet в атрибуте href задается (с префиксом "#") значение атрибута id преобразования.

Поскольку элемент xsl:stylesheet включен в преобразуемый документ, он также подвергнется преобразованию. Для того чтобы избежать этого, в преобразование включается правило шаблона, которое указывает, что элементы xsl:stylesheet следует игнорировать:

<xsl:template match="xsl:stylesheet"/>

Правила шаблона будут рассмотрены ниже.

Пример включения преобразования в преобразуемый  документ:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="#trans"?>

<email-folder>

<xsl:stylesheet

version="2.0"

id="trans"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="xsl:stylesheet"/>

</xsl:stylesheet>

</email-folder>

Хотя возможность непосредственного включения преобразования в документ XML  и определена в спецификации языка XSLT, ее поддерживают пока немногие процессоры XSLT.

5.3.6. Управление выводом в XSLT

5.3.6.1. Элемент xsl:output

Элемент-объявление верхнего уровня xsl:output позволяет задать вид сериализации результирующей иерархической структуры. Этот элемент имеет следующий синтаксис:

<xsl:output

 name="имя"

 method="xml" | "html" |  "xhtml" | "text" | "имя" 

 version="версия"

 encoding="строка"

 byte-order-mark="yes" | "no"

omit-xml-declaration="yes" | "no"

escape-uri-attributes="yes" | "no"

include-content-type="yes" | "no"

undeclare-prefixes="yes" | "no"

  normalization-form="NFC" | "NFD" | "NFKC" | "NFKD" |

 "fully-normalized" | "none" | "имя" 

standalone="yes" | "no" | "omit"

doctype-public="строка"

doctype-system="строка"

cdata-section-elements="имена"

indent="yes" | "no"

 media-type="строка"

use-character-maps="имена" 

/>

Все атрибуты элемента xsl:output являются необязательными.

Атрибут name задает имя элемента xsl:output. Если этот атрибут задан, элемент xsl:output называется именованным, в противном случае – неименованным элементом. Документ XSLT может содержать несколько именованных и неименованных элементов xsl:output. Элементы xsl:output с одинаковыми именами группируются в именованное определение вывода с заданным именем. Все неименованные элементы xsl:output также собираются в одно неименованное определение вывода.

Главным атрибутом элемента является атрибут method, который определяет, какой метод должен использоваться для вывода документа. Значением этого атрибута может быть любое имя, но при этом спецификация XSLT определяет только четыре стандартных метода вывода: "xml", "html", "xhtml" и "text". Процессор XSLT может поддерживать и другие, нестандартные, методы вывода, например, формат PDF.

Если в преобразовании не определен элемент xsl:output или в нем не указан атрибут method, метод преобразования выбирается по умолчанию исходя из следующих условий:

  •  если корневой элемент выходящего документа имеет дочерний элемент с локальным именем "html" (в нижнем регистре символов) и с URI "http://www.w3.org/1999/xhtml", которому предшествуют только пробельные символы, методом вывода по умолчанию становится "xhtml";
  •  если корневой элемент выходящего документа имеет дочерний элемент с локальным именем "html" (в любом регистре символов) без указания URI, которому предшествуют только пробельные символы, методом вывода по умолчанию становится "html";
  •  во всех остальных случаях методом вывода по умолчанию является "xml".

Использование остальных атрибутов элемента xsl:output зависит от того, какой из методов выбран для вывода преобразованного документа.

5.3.6.2. Метод вывода "xml"

Для того чтобы вывести результирующее дерево в виде документа XML, следует использовать в атрибуте method элемента xsl:output задать значение "xml". Ниже рассматриваются особенности задания других атрибутов для вывода документа XML.

Атрибут version

Этот атрибут определяет версию языка XML, которая должна использоваться для вывода результирующего документа ("1.0" или "1.1"). В случае если процессор не поддерживает заданную версию или задано неверное значение версии, выдается сообщение об ошибке.

Атрибут encoding

Атрибут encoding указывает на то, какая кодировка должна использоваться для выходного документа. Набор кодировок зависит от используемого процессора, однако обязательными для реализации являются кодировки UTF-8 и UTF-16.

Значение атрибута encoding не зависит от регистра символов, то есть значения encoding="utf-8" и encoding="UtF-8" будут эквивалентны.

В случае если процессор не поддерживает кодировку, указанную в атрибуте encoding, процессор может либо выдать ошибку, либо использовать UTF-8 или UTF-16.

Если атрибут encoding опущен, процессор должен по умолчанию использовать UTF-8 или UTF-16. На практике большинство процессоров используют по умолчанию кодировку UTF-8. Если вывод документа содержит русский или украинский текст, следует указать соответствующую кодировку, например "Windows-1251".

При выводе содержимого выходного документа может возникнуть ситуация, когда в выходящем потоке будут находиться символы, которые невозможно будет отобразить при используемой кодировке. В этом случае непечатаемые символы должны быть заменены символьными сущностями, либо выдано сообщение об ошибке.

Атрибут indent

Если этот атрибут имеет значение "yes", процессор может добавить один или несколько пробельных символов или символов перевода строки (в зависимости от реализации). Как правило, каждый дочерний элемент помещают на новой строке, добавляя впереди два пробела на каждый уровень вложенности.

Атрибут cdata-section-elements

Этот атрибут определяет список разделенных пробелами элементов, текстовое содержимое которых должно быть выведено с использованием секций CDATA.

В соответствии с синтаксисом XML, секции CDATA не могут содержать последовательности символов "]]>". Потому, встретив такую комбинацию в тексте элемента, имя которого включено в cdata-section-elements, процессор заменит ее двумя секциями CDATA. Одна будет содержать "]]", вторая – ">".

Атрибуты doctype-system и  doctype-public

Атрибут doctype-system XSLT позволяет создавать ссылки на внешние определения системных типов.  Если этот атрибут задан, его значение выводится выходном документе в декларации <!DOCTYPE …> перед первым элементом вывода. Если же задан и атрибут doctype-public, то декларация дополняется общедоступным идентификатором, заданным в значении атрибута. Атрибут doctype-public, заданный без атрибута doctype-system, игнорируется.

Атрибут media-type

Атрибут media-type позволяет задавать MIME-тип содержимого выходного документа. Для метода вывода "xml" значением media-type по умолчанию является "text/xml".

Атрибут omit-xml-declaration 

Если значение этого атрибута равно "yes", пролог документа  XML не выводится (по умолчанию значение атрибута равно "no").

Атрибут standalone

Если значение этого атрибута равно "yes" или "no", в пролог документа XML будет включен параметр standalone с соответствующим значением "yes" или "no". Если же значение атрибута равно "omit" или атрибут не задан, параметр standalone не будет включен в пролог документа XML.

Атрибут undeclare-prefixes

В пространстве имен в соответствии со спецификацией XML 1.1 допустима ситуация когда пространство имен дочернего элемента не связано с пространством имен родительского элемента (такая ситуация задается в XML 1.1 с помощью префиксов отмены). Атрибут undeclare-prefixes  задает включение префиксов отмены     в выходной документ ("yes") или отмену включения ("no")   (по умолчанию значение этого атрибута равно "no").

Атрибут normalization-form

Для выполнения операций над строками, например, сравнения строк, необходимо привести строки к эквивалентному виду (так, например, в русском языке строки "ежик" и "ёжик" являются эквивалентными). В стандарте Unicode процесс приведения называется нормализацией. Существует несколько форм нормализации: NFC, NFD, NFKC, NFKD, а также полная нормализация. Эти формы описаны в приложении №15 стандарта UnicodeUNICODE NORMALIZATION FORMS (Формы нормализации Unicode) по адресу:

http://www.unicode.org/reports/tr15/tr15-25.html.

В атрибуте normalization-form можно задать одну из форм нормализации, которая будет использоваться в выходном документе. Значение этого атрибута по умолчанию равно "none", т.е. нормализация данных не производится.

Атрибут byte-order-mark

Этот атрибут определяет вывод метки порядка байт: если значение "yes", то метка порядка байт выводится, если "no", то не выводится (по умолчанию значение этого атрибута для кодировки UTF-16 равно "yes", а для остальных кодировок равно "no")

Атрибут use-character-maps

Этот атрибут задает список именованных отображений символов  (character-maps).

Каждое отображение задается с помощью элемента-объявления xsl:character-map, который имеет следующий синтаксис:

<xsl:character-map

 name="имя"

  use-character-maps="имена"

>

 <!--

  Содержимое: элементы xsl:output-character

 -->

</xsl:character-map> 

Обязательный атрибут name задает имя отображения, которое задается в списке атрибута use-character-maps.

Соответствие между символом и заменяющей его строкой может быть задано либо во вложенных элементах xsl:output-character, либо в списке ссылок на другие элементы в необязательном атрибуте use-character-maps.

Элемент xsl:output-character имеет следующий синтаксис:

<xsl:output-character

 character="символ"

 string="строка"

/>

Атрибут string задает строку, которая в выходном документе заменит символ, заданный в атрибуте character.  

5.3.6.3. Метод вывода "xhtml"

Метод вывода "xhtml" используется для того, чтобы выводить документы в  Web-браузере в соответствии со спецификацией XHTML.

Атрибуты version, encoding, indent, cdata-section-elements, omit-xml-declaration,  standalone, doctype-system, doctype-public, undeclare-prefixes, normalization-form, media-type, byte-order-mark и use-character-maps действуют также, как и для метода "xml".

Атрибут escape-uri-attributes

Этот атрибут определяет, выводить ли атрибуты с URI в выходном документе ("no")  или нет ("yes") (по умолчанию значение этого атрибута равно "yes");

Атрибут include-content-type

Этот атрибут включает в документ XHTML в элемент head (если этот элемент задан) первым дочерним элементом элемент meta, который определяет кодировку, используемую в Web-странице (по умолчанию или заданную в атрибуте encoding).

5.3.6.4. Метод вывода "html"

Метод вывода "html" используется для того, чтобы выводить документы в  Web-браузере.

Одно из основных различий HTML и XML состоит в том, что в XML пустые элементы имеют формат <имя/>, в то время как в HTML тот же элемент был бы выведен, как <имя>. Метод вывода "html" учитывает эти различия и выводит теги пустых элементов HTML без косой черты после имени. В соответствии со спецификацией языка HTML 4.01, пустыми элементами являются area, base, basefont, br, col, frame, hr, img, input, isindex, link, meta и param.

Документы, которые преобразуются в HTML, могут также иметь сценарии, определенные внутри элемента script или стили, заданные внутри элемента style. В случае если внутри этих элементов оказываются символы, считающиеся в XML специальными, например, "<" или "&", процессор не должен заменять их символьными или встроенными сущностями.

Пример вывода сценария при преобразовании:

Предположим, что в преобразуемом документе элемент script определен с использованием специальных символов, которые заменены сущностями:

<script>if (a &gt; b) swap(a, b)</script>

или с использованием секций символьных данных:

<script><![CDATA[ if (a>b) swap(a, b) ]]></script>.

При использовании метода вывода "html" или "xhtml" оба варианта будут выведены, как

<script>if (a>b) swap(a, b)</script>.

В соответствии со спецификацией, некоторые атрибуты в HTML могут и не иметь значений (например, атрибут selected элемента option). Для того, чтобы получить в выходящем документе <option selected>, следует в преобразовании указывать

<option selected="selected">,

то есть присваивать булевому атрибуту значение, равное собственному имени.

Атрибуты encoding, indent, normalization-form, byte-order-mark и use-character-maps действуют так же, как и для метода "xml". Атрибуты escape-uri-attributes и include-content-type действуют так же, как и для метода "xhtml".

Атрибут version

Атрибут version элемента xsl:output в методе "html" обозначает версию языка HTML, которая должна использоваться в выходном документе. По умолчанию значением этого атрибута является "4.0" (последней версией языка является версия 4.01).

Атрибуты doctype-system и doctype-public

Декларация типа документа с внешними системными или общедоступными идентификаторами может быть использована в HTML точно так же, как в XML. Поскольку в объявлении типа документа после <!DOCTYPE должно стоять имя корневого элемента, при методе вывода "html" этим именем будет "HTML" или "html" в зависимости от регистра символов имени корневого элемента документа.

Атрибут media-type

Для HTML-документов значением media-type по умолчанию будет "text/html".

5.3.6.5. Метод вывода "text"

При значении атрибута method, равном "text", результатом преобразования будет строковое сложение всех текстовых узлов исходного документа.

Атрибуты encoding, normalization-form, byte-order-mark и use-character-maps действуют также, как и для метода "xml".

Атрибут media-type

По умолчанию в качестве значения атрибута media-type, используемого для простого текста, указывается "text/plain". Значение атрибута media-type может быть использовано сервером, преобразующим документ в качестве MIME-типа.

Примеры вывода для различных значений атрибута method будут приведены далее.

5.3.7. Правила шаблона в XSLT

5.3.7.1. Образцы и шаблоны

Основными компонентами документа XSLT являются  правила шаблона. Правило шаблона состоит из двух частей: это образец (pattern), который сопоставляется с узлами в исходном дереве, и шаблон (template), который содержит конструктор последовательности, используемой для создания фрагментов результирующей иерархической структуры.

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

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

При поиске соответствующего правила шаблона может возникнуть ситуация, когда обрабатываемому элементу соответствует не одно, а несколько правил. В этом случае выбирается правило с самым большим приоритетом (если правил с одинаковым приоритетом окажется несколько, генерируется ошибка).  

В правиле шаблона образец задает перечень условий для обрабатываемого узла. Узел, который отвечает этим условиям, шаблону соответствует, а узел, который условиям не отвечает, шаблону не соответствует. Синтаксис шаблонов является подмножеством синтаксиса выражений XPath. В частности, в качестве шаблонов могут использоваться пути адресации, которые отвечают определенным ограничениям.

Образец для пути адресации – это некоторый путь адресации, на всех шагах которого используются лишь оси child или attribute. Хотя образцы и не должны использовать ось descendant-or-self, в образцах могут использоваться как оператор "//", так и оператор "/". Образцы путей адресации могут начинаться также с вызова функций id или key с фиксированным аргументом. В предикатах образца могут использоваться произвольные выражения.

Примеры образцов:

  1.  Образец "/" соответствует корневому узлу.
  2.  Образец "*" соответствует любому элементу.
  3.  Образец "document-node()" соответствует узлу документа.
  4.  Образец "schema-element(book:publisher)" соответствует любому элементу в документе, определенному как реализация элемента book:publisher в схеме документа.
  5.  Образец "attribute(*, xs:gYear)" соответствует любому атрибуту документа, имеющему тип  xs:gYear.
  6.  Образец "chapter" соответствует любому элементу chapter.
  7.  Образец "chapter|appendix" соответствует любому элементу chapter и любому элементу appendix.
  8.  Образец "list/item" соответствует любому элементу item с родителем list.
  9.  Образец "partition//paragraph" соответствует любому элементу paragraph, предком которого является элемент partition.
  10.  Образец "paragraph[1]" соответствует любому первому дочернему элементу paragraph.
  11.  Образец "text()" соответствует любому текстовому узлу.
  12.  Образец "node()" соответствует любому узлу за исключением узла атрибута и корневого узла.
  13.  Образец "div[@class="chapter"]//p" соответствует любому элементу p, предком которого является элемент div, имеющий атрибут class со значением chapter.
  14.  Образец "@class" соответствует любому атрибуту class (но не любому элементу, имеющему атрибут class).
  15.  Образец "@*" соответствует любому атрибуту.
  16.  Образец "id('p1')" соответствует элементу с уникальным ID p1.

В шаблонах атрибутов могут присутствовать фиксированные и вычисляемые компоненты. Вычисляемые компоненты, как и в конструкторах XQuery заключаются в фигурные скобки "{" и "}". При преобразовании эти компоненты будут вычислены и заменены своим результатом.

Если символы "{" и "}"  используются в шаблонах атрибутов как обычные символы, они должны быть удвоены, т.е. заменены символами "{{" и "}}".  

5.3.7.2. Объявление шаблона

Объявление шаблона задается элементом xsl:template, который имеет следующий синтаксис:

<xsl:template

 match="образец"

 name="имя"

 priority="число"

 mode="режимы"

 as="тип"

>                                                            .

 <!--

 Содержимое: элементы xsl:param,

 конструктор-последовательности

 -->

</xsl:template>

Это объявление определяет шаблон, который содержит 0 и более элементов xsl:param, а также конструктор последовательности для создания набора узлов и/или атомарных значений.

Все атрибуты элемента xsl:template являются необязательными.

Атрибут match задает образец узлов дерева, для которых необходимо применить преобразования. Если элемент xsl:template содержит атрибут match, он называется правилом шаблона.

Правила шаблона вызываются при помощи инструкции xsl:apply-templates.

Объявление шаблона также может иметь имя, определяемое атрибутом name. Такое объявление называется именованным шаблоном.

Именованные шаблоны вызываются при помощи инструкции xsl:call-template.

Именованные шаблоны могут вызываться вне зависимости от текущего контекста, и даже вести себя как функции – принимать на вход параметры и возвращать некоторые значения.

При объявлении шаблона нужно обязательно указать хотя бы один из атрибутов match или name, причем эти атрибуты могут присутствовать в xsl:template одновременно. Если атрибут match не задан, атрибуты priority и mode игнорируются.

Атрибут priority используется для определения числового значения, которое называется приоритетом шаблона (чем больше число, тем больше приоритет). Это значение используется для разрешения конфликтов шаблонов в случае, когда один узел может быть обработан различными объявлениями шаблонов. Если атрибут не priority задан, используются довольно сложные правила приоритета по умолчанию, зависящие от выражения в атрибуте match. Упрощенно можно считать, что более точно определенный образец имеет более высокий приоритет, чем менее точно определенный, т.е. правило с образцом "/message/header" имеет более высокий приоритет, чем правило "//header".

Атрибут mode определяет режим или режимы обработки данного объявления шаблона. Режимы задаются как идентификаторы типа token, отделенные друг от друга пробелами. Режимы позволяют задавать различные преобразования для одних и тех же частей документа (имена этих режимов используются в элементе xsl:apply-templates). Существует два предопределенных имени режимов: "#default" (режим по умолчанию, действующий, когда режим не задан) и "#all" (правило действует для всех режимов).

Атрибут as задает тип возвращаемого функцией значения (один из типов XPath 2.0). Если этот атрибут задан, результат выполнения конструктора последовательности преобразуется к заданному типу. Если такое преобразование невозможно, генерируется сообщение об ошибке. Если  атрибут as не задан,  преобразование результата не выполняется и тип элементов результата по умолчанию становится item(), что предполагает любой тип.  

Атрибуты объявления шаблона не влияют на выполнение его содержимого. Они используются элементами xsl:apply-templates и xsl:call-template при выборе шаблонов. Правила, которые были импортированы в преобразование, вызываются могут быть вызваны элементом xsl:apply-imports.

В правиле шаблоне можно использовать не только элементы языка XSLT, но и строковые (литеральные) элементы.

Когда процессор выполняет правило шаблона, содержащее литеральные  элементы, для них в результирующем документе создаются элементы с тем же расширенным именем и атрибутами, содержимым которых является результат выполнения содержимого литерального элемента в преобразовании, т.е. литеральные элементы выводятся в результирующий документ без изменений; но их содержимое при этом все же выполняется.

Помимо литеральных элементов тело правила шаблона может также содержать следующие элементы XSLT, называемые инструкциями:

  •  xsl:apply-imports;
  •  xsl:apply-templates;
  •  xsl:attribute;
  •  xsl:call-template;
  •  xsl:choose;
  •  xsl:comment;
  •  xsl:copy;
  •  xsl:copy-of;
  •  xsl:element;
  •  xsl:fallback;
  •  xsl:for-each;
  •  xsl:if;
  •  xsl:message;
  •  xsl:number;
  •  xsl:param;
  •  xsl:processing-instruction;
  •  xsl:text;
  •  xsl:value-of;
  •  xsl:variable.

Элементы xsl:param и xsl:variable в теле шаблона определяют локальные параметры и переменные.

5.3.7.3. Вызов неименованных правил шаблона

Для применения правил шаблона (в которых не задан атрибут name) в XSLT используется элемент-инструкция xsl:apply-templates.

Этот элемент имеет следующий синтаксис:

<xsl:apply-templates

 select="выражение"

 mode="режим">

 <!--

 Содержимое: элементы xsl:sort или xsl:with-param 

 -->

</xsl:apply-templates>

Элемент xsl:apply-templates получает на входе последовательность узлов, соответствующих образцу, заданному в атрибуте match элемента xsl:template. Необязательный атрибут select задает выражение, результатом которого является последовательность узлов, которая является выборкой из исходной последовательности узлов. Если атрибут select не задан, то правила шаблона применяются ко всем дочерним  узлам текущего узла, т.е. инструкция  

<xsl:apply-templates/>

действует так же, как инструкция

<xsl:apply-templates select="child::node()"/>

В результате выполнения элемента xsl:apply-templates получается последовательность компонент, которая чаще всего добавляется к результирующей иерархической структуре.

Оба элемента xsl:template и xsl:apply-templates имеют необязательный атрибут mode. Если элемент xsl:template не имеет атрибута match, то он не должен иметь и атрибута mode. Если элемент xsl:apply-templates имеет атрибут mode, то он применяется только к тем правилам шаблона из элементов xsl:template, которые имеют атрибут mode с тем же значением, либо имеют значение атрибута mode, равное "#all". Если элемент xsl:apply-templates атрибута mode не имеет, то он применяется только к тем правилам шаблона из элементов xsl:template, которые также не имеют атрибута mode, либо имеют значение атрибута mode, равное "#default". В элементе xsl:apply-templates существует два предопределенных имени режимов: "#default" (режим, действующий по умолчанию) и "#current" (текущий режим).

Пример использования элементов xsl:template и xsl:apply-templates:

Вывод тем сообщений для документа XML email.xml (см. 5.1.1.5.2).

Преобразование XSLT имеет следующий вид:

<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" version="4.0"

encoding="windows-1251" indent="yes"/>

 <!-- Формирование выходного документа HTML -->

 <xsl:template match="/">Вывод тем сообщений

 <html>

  <head>

   <title> Вывод тем сообщений</title>

  </head>

  <body>

<!-- Применение правила шаблона для элемента subject -->

 <xsl:apply-templates select="//subject"/>

  </body>

 </html>

</xsl:template>

<!-- Задание правила шаблона для элемента subject -->

 <xsl:template match="subject">

 <p>

  <span

style="font-weight:bold;color:blue">Тема: </span>

  <xsl:apply-templates/>

 </p>

</xsl:template>

</xsl:stylesheet>

Сформированный выходной документ HTML имеет следующий вид:

<html>

 <head>

  <meta http-equiv="Content-Type"

content="text/html; charset=windows-1251">

  <title>Вывод тем сообщений</title>

  </head>

  <body>

  <p><span style="font-weight:bold;color:blue">

Тема: </span>Поздравление</p>

  <p><span style="font-weight:bold;color:blue">

Тема: </span>Напоминание</p>

  <p><span style="font-weight:bold;color:blue">

Тема: </span>Отказ</p>

  <p><span style="font-weight:bold;color:blue">

Тема: </span>Вопрос</p>

  <p><span style="font-weight:bold;color:blue">

Тема: </span>Ответ</p>

  </body>

</html> 

Вывод результата преобразования в Web-браузере будет иметь следующий вид:

5.3.7.4. Упрощенные преобразования

Многие простые преобразования состоят из единственного правила, которое обрабатывает корневой узел входящего документа как в следующем примере:

<xsl:stylesheet

version="l.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<result>

<!-- Шаблон -->

</result>

</xsl:template>

</xsl:stylesheet>

В XSLT можно упрощать запись таких преобразований, опуская элементы xsl:stylesheet и xsl:template и оставляя только правило шаблона, создающий выходящий документ.

Корневой элемент упрощенной записи должен содержать атрибут xsl:version, указывающий версию языка XSLT, использованного в шаблоне. Как правило, этот элемент также содержит объявление пространства имен XSLT, хотя оно может быть определено и в другом месте.

Так, приведенное выше преобразование можно записать в упрощенном виде следующим образом:

<result

xsl:version="l.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- Шаблон -->

</result >.

5.3.8. Создание узлов элементов и атрибутов в XSLT 

5.3.8.1. Элемент xsl:element

Каждому элементу документа XML соответствует узел элемента. Дочерними узлами узла элемента могут быть узлы его дочерних элементов, а также узлы комментариев, инструкций по обработке и текстовые узлы, которые представляют его непосредственное содержимое. Следует отметить, что узлы атрибутов не считаются дочерними узлами своего элемента, они лишь только ассоциируются с ними.

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

 Для создания элемента с вычисляемым названием используется элемент xsl:element, который имеет следующий синтаксис:

<xsl:element

name="имя"

namespace="пространство-имен"

inherit-namespaces="yes" | "no"                                       

use-attribute-sets="имена"

 type="имя-типа"

  validation="strict" | "lax" | "preserve" | "strip"

>   

 <!--

 Содержимое: конструктор последовательности

 -->

</xsl:element>                       

Здесь обязательный атрибут name указывает имя создаваемого элемента. Этот атрибут может содержать шаблон значения, а значит, имя элемента может быть вычислено во время выполнения. Все остальные атрибуты элемента являются необязательными.

Атрибут namespace указывает URI пространства имен создаваемого элемента. Точно так же, как и name, этот атрибут может содержать шаблон значения, что позволяет вычислять пространство имен создаваемого элемента при помощи выражений.

В качестве значений атрибутов name и namespace могут быть использованы вычисляемые выражения, т.е. выражения, заключенные в фигурные скобки "{" и "}".

Атрибут inherit-namespaces задает ("yes") или отменяет ("no")  наследование узлов пространства имен для потомков создаваемого элемента. По умолчанию значение этого атрибута равно "yes".

Атрибут use-attribute-sets перечисляет (через пробел) имена наборов атрибутов, которые должны быть включены в создаваемый элемент.

Атрибут type задает проверку создаваемого элемента на соответствие простому или комплексному типу, заданному в значении атрибута и определенному в схеме документа.

Атрибут validation определяет действия по проверке действительности создаваемого элемента. Значение "strip" этого атрибута указывает, что новый элемент и все содержащиеся в нем узлы должны иметь тип xs:untyped. Значение "preserve" указывает, что копируемые элементы сохраняют свой тип,  а создаваемые элементы будут иметь тип xs:untyped. Значение "strict" указывает, что создаваемые и копируемые элементы должны строго соответствовать своему типу, определенному в схеме документа (в случае такого несоответствия выдается сообщение об ошибке). Значение "lax" аналогично значению "strict", за исключением того, что в случае несоответствия сообщения об ошибке не выдается, а создаваемые или копируемые элементы будут иметь тип xs:untyped.

Атрибуты type и validation являются взаимоисключающими, т.е. в элементе может быть задан только один из этих атрибутов.

Содержимым xsl:element является конструктор последовательности, который создается процессором и затем включается в создаваемый элемент.

5.3.8.2. Элемент xsl:attribute

Атрибутам того или иного элемента соответствуют узлы атрибутов. Считается, что узел элемента является родителем узла своего атрибута, но вместе с тем узел атрибута не является дочерним узлом узла его элемента. Такая ситуация отличает дерево документа в XSLT от дерева в DOM – отношение между элементом и атрибутом не является отношением наследования, а отношением ассоциации. Говорят, что узел атрибута ассоциируется с узлом элемента.

Узел атрибута задается конструкцией вида:

<xsl:attribute

 name="имя"

 namespace="пространство-имен"

 select="выражение"

  separator?="строка"

  type="имя-типа"

  validation="strict" | "lax" | "preserve" | "strip"

>

 <!--

 Содержимое: конструктор последовательности 

 -->

</xsl:attribute>

Использование элементов xsl:attribute и xsl:element во многом аналогично. Обязательный атрибут name задает имя атрибута, а все остальные атрибуты также являются необязательными.

Атрибут namespace задает URI пространства имен создаваемого атрибута.

Атрибут select задает строковое значение нового атрибута (альтернативным является задание значения атрибута в конструкторе последовательности элемента xsl:attribute).

Атрибут separator задает символы-разделители между элементами сгенерированной последовательности при их преобразовании в результирующее строковое значение. По умолчанию таким разделителем является одиночный пробел. Если в качестве разделителя задана пустая строка, разделителей между элементами не будет.

В качестве значений атрибутов name, namespace и separator могут быть использованы вычисляемые выражения, т.е. выражения, заключенные в фигурные скобки "{" и "}".

Атрибут type задает проверку создаваемого атрибута на соответствие простому или комплексному типу, заданному в значении атрибута и определенному в схеме документа.

Атрибут validation определяет действия по проверке действительности создаваемого узла документа. Значение "strip" этого атрибута указывает, что новый атрибут должен иметь тип xs:untypedAtomic. Значение "preserve" указывает, что копируемые атрибуты сохраняют свой тип,  а создаваемые атрибуты будут иметь тип xs:untypedAtomic. Значение "strict" указывает, что создаваемые и копируемые атрибуты должны строго соответствовать своему типу, определенному в схеме документа (в случае такого несоответствия выдается сообщение об ошибке). Значение "lax" аналогично значению "strict", за исключением того, что в случае несоответствия сообщения об ошибке не выдается, а создаваемые или копируемые атрибуты будут иметь тип xs:untypedAtomic.

Атрибуты type и validation являются взаимоисключающими, т.е. в элементе может быть задан только один из этих атрибутов.

Если атрибут создается в элементе, который уже имеет атрибут с таким же именем, старый атрибут будет переопределен новым значением.

Использование элемента xsl:attribute имеет следующие основные особенности:

  •  атрибуты могут создаваться только в узлах элементов (если атрибут создается в узле, который не является узлом элемента, процессор может либо выдать ошибку, либо проигнорировать создаваемый атрибут);
  •  атрибуты могут содержать только текстовые узлы (процессор может либо выдать ошибку, либо проигнорировать нетекстовые узлы);
  •  узлы атрибутов должны быть первыми узлами, которые создаются в элементах (XSLT не разрешает создавать атрибуты после того, как в элемент включены дочерние узлы других типов);
  •  элемент не может использоваться для генерации объявлений пространств имен;
  •  элемент не может создавать атрибуты, имена которых имеют префикс xmlns;
  •  в случае, когда документ преобразуется в другой документ XML, символы перевода строки в элементе заменяются символьными сущностями.

Элемент xsl:attribute может быть использован в содержимом любого из следующих родителей:

  •  литерального элемента результата;
  •  элемента xsl:element;
  •  элемента xsl:copy в случае, если текущий, копируемый узел является элементом;
  •  элемента xsl:attribute-set в случае определения именованного набора атрибутов.

Элемент xsl:attribute обычно используется, если:

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

5.3.8.3. Элемент xsl:attribute-set

Для того чтобы упростить создание в элементах целых наборов атрибутов, можно заранее определить их в элементе xsl:attribute-set, который имеет следующий синтаксис:

<xsl:attribute-set

 name="имя"

 use-attribute-sets="имена"

>

 <!--

 Содержимое: элементы xsl:attribute 

 -->

</xsl:attribute-set>

Обязательный атрибут name задает имя набора атрибутов. В атрибуте use-attribute-sets через пробел перечисляются имена наборов атрибутов, которые должны быть использованы в данном элементе.

Элемент xsl:attribute-set содержит последовательность, состоящую из нуля или более элементов xsl:attribute.

Именованные наборы атрибутов можно использовать, указывая их имена в значении атрибута use-attribute-sets, который может присутствовать в элементах xsl:element, xsl:copy и xsl:attribute-set, а также в литеральных результирующих элементах.

Включение набора атрибутов в элемент равносильно простому копированию элементов xsl:attribute, определенных в соответствующих элементах xsl:attribute-set.

Пример использования элементов xsl:element, xsl:attribute и xsl:attribute-set:

Следующая таблица стилей формирует документ HTML для вывода тем сообщений в документе XML message.xml:

<?xml version="1.0" encoding="windows-1251"?>

<xsl:stylesheet version="2.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="html" version="4.0"

encoding="windows-1251" indent="yes"/>

<xsl:attribute-set name="hrAttrs">

  <xsl:attribute name="width">25%</xsl:attribute>

 <xsl:attribute name="color">green</xsl:attribute>

 <xsl:attribute name="align">left</xsl:attribute>

</xsl:attribute-set>

 <!-- Формирование выходного документа HTML -->

<xsl:template match="/">

 <html>

  <head>

   <title>Вывод тем сообщений</title>

   <style type="text/css">

    .red {color:red}

    .bold {font-weight:bold}

   </style>

  </head>

  <body>

<!-- Применение правила шаблона для элемента message -->

 <xsl:apply-templates

select="email-folder/message"/>

<!-- Задание элемента hr -->

 <xsl:element name="hr"

use-attribute-sets="hrAttrs"/>

  </body>

 </html>

</xsl:template>

<!-- Задание правила шаблона для элемента message -->

 <xsl:template match="message">

<!-- Задание элемента hr -->

 <xsl:element name="hr"

use-attribute-sets="hrAttrs"/>

<!-- Задание элемента p -->

 <p class="bold">Тема:

<!-- Задание элемента span -->

  <xsl:element name="span">

<!-- Задание атрибута class для элемента span -->

   <xsl:attribute

name="class">red</xsl:attribute>

<!-- Получение значения для элемента subject -->

   <xsl:apply-templates

select="./header/subject/text()"/>

  </xsl:element>

 </p>

</xsl:template>

</xsl:stylesheet>

В результате преобразования документ HTML будет иметь следующий вид:

<html>

<head>

 <meta http-equiv="Content-Type"

content="text/html; charset=windows-1251">

 <title>Вывод тем сообщений</title>

 <style type="text/css">

  .red {color:red}

  .bold {font-weight:bold}

 </style>

</head>

<body>

 <hr width="25%" color="green" align="left">

 <p class="bold">Тема:<span

class="red">Поздравление</span></p>

 <hr width="25%" color="green" align="left">

 <p class="bold">Тема: <span

class="red">Напоминание</span></p>

 <hr width="25%" color="green" align="left">

 <p class="bold">Тема: <span

class="red">Отказ</span></p>

 <hr width="25%" color="green" align="left">

 <p class="bold">Тема: <span

class="red">Вопрос</span></p>

 <hr width="25%" color="green" align="left">

 <p class="bold">Тема: <span

class="red">Ответ</span></p>

 <hr width="25%" color="green" align="left">

</body>

</html>

и в Web-браузере будет выведено:

 

Файл: file:///web/1/5fan/public_html/www/files/13/5fan_ru_69060_a72201925f397131263c04a63cb2ba76.doc   Создан: 2008-03-16T09:04:00Z Модифицирован: 2008-03-16T09:04:00Z     Автор:


Процессор XSLT

Структура

документа XSLT

Структура

документа XML

труктура

выходного документа

Структура

документа XML

Структура

документа XSLT

Процессор XSLT

Процессор XSLT

Документ XML

Документ XSLT

Структура

выходного документа

Документ XHTML

Документ HTML

Документ XML

Документ XML

Документ другого формата

Текстовый документ

Документ XML

Документ XML

Документ XML

Документ XML


 

А также другие работы, которые могут Вас заинтересовать

4565. Определение интенсивности теплового излучения 43.23 KB
  Определение интенсивности теплового излучения Цель работы Измерение интенсивности теплового излучения, определение эффективности теплозащитных экранов. Теория метода К теплоотражающим относят экраны, изготовленные из материалов, хорошо отражающих те...
4566. Запутывающие преобразования в программировании 23.15 KB
  Запутывающие преобразования Цель работы: научится программировать средства затрудняющие изучение программ. Задание: Изучить основные методы обфускации. По заданию преподавателя запрограммировать один из методов. Провести оценку зап...
4567. Линейный конгруэнтный метод в программировании 97.5 KB
  Линейный конгруэнтный метод Линейный конгруэнтный метод является одной из простейших и наиболее употребительных в настоящее время процедур, имитирующих случайные числа. В этом методе используется операция mod(x, y), возвращающая остаток от деления п...
4568. Использование параллелизма процессора для повышения эффективности программ 35.5 KB
  Использование параллелизма процессора для повышения эффективности программ Цель работы: научить студента самостоятельно разрабатывать максимально эффективные программы. Материал для изучения. Рассмотрим задачу умножения двух n ...
4569. Модели и стандарты управления рисками проектов программных средств 603 KB
  Модели и стандарты управления рисками проектов программных средств. Основные модели управления рисками проектов программных средств Разработано несколько моделей и стандартов для анализа и сокращения рисков в жизненном цикле программных средств...
4570. Структурное тестирование программного обеспечения 173.5 KB
  Структурное тестирование программного обеспечения Основные понятия и принципы тестирования ПО Тестирование — процесс выполнения программы с целью обнаружения ошибок. Шаги процесса задаются тестами. Каждый тест определяет: свой набор исход...
4571. Разработка учебная Базы Данных (БД) MusicShop 696 KB
  Введение В настоящие время в связи с развитием компьютерной техники появилась возможность автоматизировать многие процессы. Современные магазины музыки предлагают большой выбор музыки, в связи с чем, возникает проблема поиска необходимой композиции,...
4572. Решение задачи коммивояжера разными программными методами 84.06 KB
  Введение Комбинаторика – раздел математики, посвящённый решению задач выбора и расположения элементов некоторого, обычно конечного множества в соответствии с заданными правилами. Каждое такое правило определяет способ построения некоторой конст...
4573. Кратчайший путь в графе. Методы программирования 151 KB
  Программный продукт предназначен для нахождения кратчайшего пути между двумя любыми вершинами графа. Проектирование Алгоритм Дейкстры. Алгоритм Дейкстры строит кратчайшие пути, ведущие из исходной вершины графа к остальным вершинам этог...