13957

Преобразование документов XML с использованием языка XSLT

Лабораторная работа

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

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

Русский

2014-11-30

565 KB

21 чел.

Лабораторная работа 4-05

Преобразование документов XML с использованием языка XSLT 

1. Цель работы

Целью работы является приобретение навыков обработки документов XML с использованием языка XSLT.     

  

2. Состав рабочего места

2.1. Оборудование: IBM-совместимый   персональный компьютер (ПК).

2.2. Программное обеспечение: операционная система Windows, программа XMLSpy.

3. Краткие теоретические сведения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.1.2. Пространство имен 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 допустимы расширения языка, то для компонент расширений также необходимо задавать свои пространства имен.

3.1.3. Корневые элементы и элементы верхнего уровня документа 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) не имеет значения.

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

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

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

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

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

 

<xsl:include 

 href = "URI"/>

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

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

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

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

  •  все ссылки и относительные идентификаторы ресурсов (URI), используемые во включаемом преобразовании, вычисляются относительно его базового адреса;
  •  включаемые модули также могут включать другие преобразования при помощи тех же элементов xsl:include (при этом преобразование не должно прямо или косвенно включать само себя).  

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

<xsl:import 

 href="URI"/>

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

Так же, как и в случае с xsl:include, элемент xsl:import логически заменяется содержимым внешнего модуля, и относительные идентификаторы ресурсов (URI), используемые во внешнем преобразовании, отсчитываются от его базового адреса. Преобразование не может прямо или косвенно импортировать само себя.

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

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

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

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

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

<xsl:import-schema

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

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

>

 <!--

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

-->

</xsl:import-schema>

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

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

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

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

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

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

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

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

3.2.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". Процессор может поддерживать и другие, нестандартные, методы вывода, например, формат PDF.

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

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

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

3.2.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.  

3.2.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).

3.2.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 специальными, например, "<" или "&", процессор не должен заменять их символьными или встроенными сущностями.

В соответствии со спецификацией, некоторые атрибуты в 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".

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

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

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

Атрибут media-type

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

3.3.Язык XSLT

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

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

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

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

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

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

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

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

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

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

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

<xsl:template

match="образец"

name="имя"

priority="число"

 mode="режимы"

 as="тип-последовательности"

>                                                            .

 <!--

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

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

 -->

</xsl:template>

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

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

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

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

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

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

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

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

Атрибут priority используется для определения числового значения, которое называется приоритетом шаблона (чем больше число, тем больше приоритет). Это значение используется для разрешения конфликтов шаблонов в случае, когда один узел может быть обработан различными объявлениями шаблонов.

Атрибуты объявления шаблона не влияют на выполнение его содержимого. Они используются элементами 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 в теле шаблона определяют локальные параметры и переменные.

3.3.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" (текущий режим).

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

3.3.4.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 является конструктор последовательности, который создается процессором и затем включается в создаваемый элемент.

3.3.4.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 (например, условный вывод атрибута).

3.3.4.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.

3.3.5. Создание текстовых узлов в XSLT

Символьные данные, содержащиеся в документе, организуются в виде текстовых узлов. Последовательности символов, встречающиеся в документах, в целях экономии никогда не разбиваются на два или более текстовых узла, а текстовые узлы никогда не бывают пустыми. Содержание секций CDATA обрабатываются так, как если бы их содержимое было просто включено в документ с заменой символов "<" и "&", на сущности &lt; и &amp;.

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

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

Текстовые узлы могут также быть созданы элементами xsl:text и xsl:value-of.

3.3.5.1. Элемент xsl:text

Элемент xsl:text используется для создания текстовых узлов, содержащих пробельные и специальные символы, и имеет следующий синтаксис:

<xsl:text>

 <!--

 Содержимое: символьные данные (#PCDATA) 

 -->

</xsl:text>

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

<xsl:text>&#10;</xsl:text>.

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

3.3.5.2. Элемент xsl:value-of

Элемент xsl:value-of выводит в выходящее дерево строковый результат вычисления выражений и имеет следующий синтаксис:.

<xsl:value-of

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

separator="строка"

>

<!--

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

 -->

</xsl:value-of>

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

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

3.3.5.3. Встроенные правила шаблона

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

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

<xsl:template match="*|/">

  <xsl:apply-templates/>

</xsl:template>.

Для каждого метода также есть встроенное правило шаблона, позволяющее рекурсивно продолжать обработку в том же самом режиме, в отсутствии успешного сравнения с образцом из явного правила шаблона в этом стиле. Это правило шаблона применяется как для узлов элементов, так и для корневого узла. Далее приведен эквивалент встроенного правила шаблона для режима m.

<xsl:template match="*|/" mode="m">

  <xsl:apply-templates mode="m"/>

</xsl:template>.

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

<xsl:template match="text()|@*">

  <xsl:value-of select="."/>

</xsl:template>.

Для инструкций обработки и комментариев встроенное правило шаблона не должно делать ничего:

<xsl:template match="processing-instruction()|comment()"/>

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

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

3.3.5.4. Обработка пробельных символов

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

  •  пробел (десятичный код: #32, шестнадцатеричный код #x20);
  •  перевод строки (десятичный код: #10, шестнадцатеричный код #xA);
  •  возврат каретки (десятичный код: #13, шестнадцатеричный код #xD);
  •  горизонтальная табуляция (десятичный код: #9, шестнадцатеричный код #x9).

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

  •  Он содержит хотя бы один непробельный символ.
  •  Он принадлежит элементу, в котором сохранение пробельных символов задано средствами XML, а именно атрибутом xml:space со значением preserve.
  •  Он принадлежит элементу, имя которого включено во множество имен элементов, для которых нужно сохранять пробельные символы.

Во всех остальных случаях текстовый узел будет удален.

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

Для входящих документов сохраняющее множество состоит из имен всех элементов. То есть по умолчанию преобразования сохраняют все пробельные текстовые узлы. Для изменения сохраняющего множества элементов входящего документа используются элементы xsl:preserve-space и xsl:strip-space.

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

<xsl:preserve-space

elements="имена"

/>

<xsl:strip-space

elements="имена"

/>

Элемент xsl:preserve-space добавляет, a xsl:strip-space удаляет имя элемента из сохраняющего множества входящего документа.

Обязательные атрибуты elements элементов xsl:strip-space и xsl:preserve-space содержат либо значение "*", либо список имен, разделенных пробелами.

Значение "*" используется для выбора произвольных имен. Ему будут соответствовать любые имена элементов.

Имя в списке может быть  либо именем элемента, либо иметь форму "префикс:*". В первом случае выбор будет производиться для всех элементов с заданным именем, например, для удаления пробельных символов в элементах d и c в преобразовании достаточно указать:

<xsl:strip-space elements="d c"/>.

Во втором случае будет производиться выбор всех элементов в данном пространстве имен. Например, если в документе определен префикс пространства имен upr в виде атрибута xmlns:upr="http://www.upr.com", проверке имени "upr:*" будут соответствовать все элементы пространства имен, определяемого идентификатором "http://www.upr.com".

3.3.6. Создание узлов документа, комментариев, инструкций по обработке и пространства имен в XSLT

3.3.6.1. Элемент xsl:document

Новый узел документа создается с помощью следующей инструкции:

<xsl:document

  type="имя"

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

>

  <!--

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

 -->

</xsl:document>

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

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

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

3.3.6.2. Элемент xsl:result-document

Элемент-инструкция xsl:result-document используется для создания конечной результирующей иерархической структуры и имеет следующий синтаксис:

<xsl:result-document

  format="имя"

  href="URI"

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

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

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

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

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

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

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

  encoding="строка"

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

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

  indent="yes" | "no"

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

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

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

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

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

  undeclare-prefixes="yes" | "no"

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

  output-version="строка"

>

  <!--

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

 -->

</xsl:result-document>

Все атрибуты элемента result-document являются необязательными.

Атрибуты type и validation действуют так же, как в элементе xsl:element.

Атрибуты byte-order-mark, cdata-section-elements, doctype-public, doctype-system, encoding, escape-uri-attributes, include-content-type, indent, media-type, normalization-form, omit-xml-declaration, standalone, undeclare-prefixes и use-character-maps действуют так же, как в элементе xsl:output. За исключением атрибута use-character-maps, все эти атрибуты могут иметь вычисляемые значения.

Атрибут output-version действует так же, как и атрибут version  элемента xsl:output.

Атрибут format задает имя, к которому добавляется префикс пространства имен (если он есть) в области видимости элемента result-document. Расширенное значение имени должно соответствовать одному из имен в именованных элементах xsl:output. В этом случае формирование выходного документа будет выполняться под управлением именованного определения вывода xsl:output с заданным именем. Если  атрибут format не задан,  формирование выходного документа будет выполняться под управлением неименованного определения вывода xsl:output.

Атрибут href задает базовый URI узла документа в корне конечной результирующей иерархической структуры.

3.3.6.3. Элемент xsl:comment

Элемент-инструкция xsl:comment создает в результирующем дереве узел комментария. Текстом комментария становится результат выполнения шаблона, который содержится в элементе xsl:comment. Этот элемент имеет следующий синтаксис:

<xsl:comment

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

>

 <!--

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

 --> 

</xsl:comment>

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

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

3.3.6.4. Элемент xsl:processing-instruction

Элемент xsl:processing-instruction создает в результирующем дереве узел инструкции по обработке и имеет следующий синтаксис:

<xsl:processing-instruction

name="имя"

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

>

<!--

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

 --> 

</xsl:processing-instruction>

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

Необязательный атрибут select задает строковое значение новой инструкции по обработке (альтернативным является задание строкового значения новой инструкции по обработке в конструкторе последовательности элемента xsl:processing-instruction).

Инструкция по обработке не может содержать последовательности символов "?>".

Если результат выполнения шаблона содержит такую комбинацию, процессор может либо выдать ошибку, либо разделить символы "?" и ">" пробелом: "? >".

Имя инструкции по обработке, должно быть корректным именем XML (но не равным при этом "xml" в любом регистре символов).

3.3.6.5. Элемент xsl:namespace

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

<xsl:namespace

name="имя"

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

>

<!--

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

 --> 

</xsl:namespace>

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

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

3.3.7. Копирование узлов в XSLT

Преобразование может включать в себя не только создание новых, но и Преобразование может включать в себя не только создание новых, но и копирование существующих узлов. Для этого можно использовать элементы xsl:copy и xsl:copy-of, а также элемент xsl:sequence.

3.3.7.1. Элемент xsl:copy

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

Элемент-инструкция xsl:copy имеет следующий синтаксис:

<xsl:copy

copy-namespaces="yes" | "no"

inherit-namespaces="yes" | "no"                                       

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

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

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

>   

 <!--

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

 -->

</xsl:copy>

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

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

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

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

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

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

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

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

3.3.7.2. Элемент xsl:copy-of

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

<xsl:copy-of

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

copy-namespaces="yes" | "no"

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

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

/>

Использование элемента xsl:copy-of полностью аналогично использованию элемента xsl:value-of за тем исключением, что xsl:copy-of при выводе значения выражения преобразует его к строке не во всех случаях. Поведение xsl:copy-of зависит от того, какой тип данных возвращает выражение, заданное в обязательном атрибуте select.

Если результат вычисления имеет булевский, числовой или строковый тип, то xsl:copy-of выводит его в виде текстового узла. В этом случае поведение xsl:copy-of не отличается от поведения элемента xsl:value-of.

Если результатом вычисления выражения является последовательность узлов, то xsl:copy-of копирует в выходящий документ все узлы в порядке просмотра документа вместе с их потомками.

Если результатом вычисления является узел документа, то он копируется в выходящий документ в неизмененном виде.

Атрибуты type и validation в элементе xsl:copy-of действуют так же, как в элементе xsl:copy.

3.3.7.3. Элемент xsl:sequence

Элемент-инструкция xsl:sequence используется в содержимом конструктора последовательности для создания последовательности узлов или атомарных значений. Этот элемент в XSLT 2.0 имеет следующий синтаксис:

<xsl:sequence
    select ="выражение"

/>

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

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

3.3.8. Условная и циклическая обработка в XSLT

3.3.8.1. Элемент xsl:if

Элемент xsl:if позволяет создавать простые условия типа «если, то» и имеет следующий синтаксис:

<xsl:if

 test="выражение''

>

 <!--

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

 -->

</xsl:if>

Выражение, содержащееся в обязательном атрибуте test, вычисляется и приводится к булевому типу. В том и только том случае, если выражение имеет значение true, процессор выполняет шаблон, содержащийся в xsl:if.

Вследствие того, что атрибуты в XML не могут содержать некоторые специальные символы (такие как "<" и "&"), их необходимо заменять символьными сущностями. Так, инструкция

<xsl:if test="a < b"/>

будет с точки зрения синтаксиса XML некорректным. Вместо нее следует использовать эквивалентную инструкцию

<xsl:if test="a &lt; b"/>.

3.3.8.2. Элементы xsl:choose, xsl:when и xsl:otherwise

Инструкция xsl:choose вместе с инструкциями xsl:when и xsl:otherwise создает более сложную конструкцию для выбора одной из нескольких имеющихся возможностей в зависимости от выполнения тех или иных условий.

Элементы xsl:choose, xsl:when и xsl:otherwise имеют следующий синтаксис:

<xsl:choose>

<!--

 Содержимое: один или более элемент xsl:when,

 необязательный элемент xsl:otherwise 

-->

</xsl:choose>

<xsl:when

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

>

<!--

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

-->

</xsl:when>

<xsl:otherwise>

<!--

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

--> 

</xsl:otherwise>

Элемент xsl:choose содержит один или несколько элементов xsl:when и необязательный элемент xsl:otherwise. При обработке xsl:choose процессор поочередно вычисляет выражения, содержащиеся в атрибутах test элементов xsl:when, приводит их к булевскому типу и выполняет содержимое первого (и только первого) элемента, тестовое выражение которого будет равно true. В случае если ни одно из тестовых выражений не равно истине и в xsl:choose присутствует xsl:otherwise, процессор выполнит содержимое этого элемента. Если же ни одно из тестовых выражений не равно истине и в xsl:choose нет элемента  xsl:otherwise, то ничего не создается.

Общая форма (скелет) альтернативного выбора с помощью инструкции  xsl:choose записывается в следующем виде:

<xsl:choose>

<xsl:when test="условие-1">

шаблон-1

</xsl:when>

<xsl:when test="условие-2">

шаблон-2

</xsl:when>

<!-- ... -->

<xsl:when test="условие-N">

шаблон-N

</xsl:when>

<xsl:otherwise>

шаблон-N+1

</xsl:otherwise>

</xsl:choose>.

3.3.8.3. Элемент xsl:for-each

Элемент xsl:for-each используется для создания в выходящем документе повторяемых частей структуры и имеет следующий синтаксис:

 

<xsl:for-each

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

>

 <!--

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

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

 --> 

</xsl:for-each>

Обязательный атрибут select указывает выражение, результатом вычисления которого должно быть множество узлов. Шаблон, содержащийся в xsl:for-each, будет выполнен процессором для каждого узла этого множества.

3.3.9. Сортировка в XSLT

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

Элементы xsl:for-each и xsl:apply-templates могут содержать один или несколько элементов xsl:sort, которые позволяют предварительно сортировать обрабатываемое множество узлов.

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

<xsl:sort

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

lang = "язык"

data-type = "text" | "number" | "имя"

order = "ascending" | "descending"

collation? = "URI"

stable = "yes" | "no"

case-order = "upper-first" | "lower-first"

data-type = "text" | "number" | "имя"

>

<!--

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

--> 

</xsl:sort>

Если xsl:for-each и xsl:apply-templates содержат элементы xsl:sort, обработка множества узлов должна производиться не в порядке просмотра документа, а в порядке, который определяется ключами, вычисленными при помощи xsl:sort. Первый элемент xsl:sort, присутствующий в родительском элементе, определяет первичный ключ сортировки, второй элемент – вторичный ключ, и так далее.

Элемент xsl:sort обладает атрибутом select, значением которого является выражение, называемое также ключевым выражением. Это выражение вычисляется для каждого узла обрабатываемого множества, преобразуется в строку и затем используется как значение ключа при сортировке. По умолчанию значением этого атрибута является ".", что означает, что в качестве значения ключа для каждого узла используется его строковое значение.

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

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

  •  Атрибут order определяет порядок, в котором узлы должны сортироваться по своим ключам. Этот атрибут может принимать только два значения – "ascending", указывающее на восходящий порядок сортировки, и "descending", указывающее на нисходящий порядок (по умолчанию сортировка выполняется в восходящем порядке).
  •  Атрибут lang определяет язык ключей сортировки (этот атрибут может иметь те же самые значения, что и атрибут xml:lang, например: "en", "en-us", "ru" и т. д.). Если значение этого атрибута не определено, процессор может либо определять язык исходя из параметров системы, либо сортировать строки исходя из порядка кодов символов Unicode.
  •  Атрибут data-type определяет тип данных, который несут строковые значения ключей. Значение "text" (это значение по умолчанию) определяет, что ключи должны быть отсортированы в лексикографическом порядке исходя из языка, определенного атрибутом lang или параметрами системы. Значение "number" определяет, что  ключи должны сравниваться в численном виде (если строковое значение ключа не является числом, оно будет преобразовано к не-числу – NaN, и, поскольку нечисловые значения неупорядочены, соответствующий узел может появиться в отсортированном множестве где угодно). Значение "имя" тип данных, который определяется конкретным процессором XSLT (например, сортировка дат).
  •  Атрибут case-order указывает на порядок сортировки символов разных регистров. Если значение атрибута равно "upper-first", то заглавные символы должны идти первыми, если "lower-first" – первыми должны идти строчные символы. Значение этого атрибута по умолчанию зависит от процессора и языка сортировки. В большинстве случаев заглавные буквы идут первыми.
  •  Атрибут stable задает ("yes") или отменяет ("no")  спецификацию ключа сортировки для первого сортируемого элемента. По умолчанию значение этого атрибута равно "yes".
  •  Атрибут collation задает ссылку на ресурс, содержащий правила сравнения строк.

3.3.10. Нумерация в XSLT

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

Для вычисления порядковых номеров узлов в дереве в XSLT существует несколько способов. В простых случаях для достижения цели бывает достаточно воспользоваться одним из следующих выражений XPath:

  •  Для того чтобы получить порядковый номер текущего узла в обрабатываемом множестве, можно использовать функцию position.
  •  Функция count(preceding-sibling::*)+l возвращает порядковый номер (начиная c 1) текущего элемента среди других элементов его родителя (путь выборки preceding-sibling::* выбирает множество братских элементов, предшествующих текущему узлу, а функция count   вычисляет   их   количество);   
  •  Для того чтобы учитывать при подсчете только определенные элементы, можно переписать предыдущее выражение в чуть более строгом виде (например, выражение, считающее только элементы chapter, будет задаваться следующим образом: (preceding-sibling::header)+1);
  •  Глубина текущего узла от корня дерева может быть вычислена с помощью выражения count(ancestor-or-self::node()) (это выражение будет возвращать 1 для корневого узла, 2 для элемента документа и так далее).

Вычисление выражений и вывод вычисленных значений в результирующее дерево выполняется при помощи элемента xsl:value-of, например:

<xsl:value-of

select="count(preceding-sibling::header)+1"/>.

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

Другим, более легким и удобным способом нумерации и индексирования узлов является использование элемента xsl:number. Этот элемент имеет следующий синтаксис:

<xsl:number

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

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

 level="single" | "multiple" | "any" 

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

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

format="строка"

lang="имя"

letter-value="alphabetic" | "traditional"

ordinal="строка"  

grouping-separator="символ"

 grouping-size="число"

/>

Элемент xsl:number вычисляет номер узла в соответствии с заданными критериями, форматирует его и затем вставляет в результирующее дерево в виде текстового узла. Ни один из атрибутов этого элемента не является обязательным.

Атрибут value содержит выражение, которое обрабатывается, а полученный объект преобразуется в число, как при вызове функции XPath number(). Затем это число округляется до целого и преобразуется в строку с учетом атрибутов format, lang, letter-value, grouping-separator и grouping-size (если они заданы). После преобразования полученная строка подставляется в конечное дерево.

Атрибуты level, count и from показывают, как будет нумероваться текущий узел.

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

Атрибут from содержит образец, который определяет так называемую область нумерации, или область подсчета. При вычислении номера будут приниматься во внимание только те нумеруемые узлы, которые принадлежат этой области. По умолчанию областью подсчета является весь документ.

Атрибут level имеет три варианта значений: single, multiple и any, значением по умолчанию является single. Процедура вычисления номеров существенным образом зависит от того, какой из этих вариантов используется: при методе single считаются элементы на одном уровне, при методе multiple – на  нескольких уровнях и при методе any – на любых уровнях дерева.

Значение строки формата в атрибуте format может состоять из имеющих специальное значение алфавитно-цифровых символов 1, A, a, I и i, а также из любых других символов. Символ 1 обозначает нумерацию арабскими буквами, символы A и a – нумерацию большими и маленькими латинскими буквами, а символы I и i – нумерацию   большими и маленькими римскими цифрами. Все остальные символы передаются в выводимую строку без изменения.

Для нумерации большими и малыми русскими буквами необходимо задавать алфавитно-цифровой символ в виде ссылок на сущности: "&#х410;" (русская заглавная буква "A") и "&#х430;" (русская строчная буква "а").

Атрибут letter-value устраняет неясности в последовательностях нумерации, использующих буквы. Во многих языках обычно используются две основные последовательности нумерации, использующие буквы. В одной из них нумерация производится буквенными значениями в алфавитном порядке, в другой же числовое значение каждому пункту назначается по-другому, так как это принято для данного языка. В английском языке это будет соответствовать последовательностям нумерации, задаваемым лексемами форматирования a и i. В некоторых языках первый член обеих последовательностей одинаков, а потому одной лексемы форматирования будет недостаточно. Значение "alphabetic" указывает алфавитную последовательность, значение "traditional" – альтернативную. Если атрибут letter-value не указан, порядок разрешения любых неоднозначностей определяется реализацией. Этим атрибутом надо пользоваться осторожно, поскольку в разных процессорах он реализуется по-разному.

При использовании цифровых форматов нумерации (иными словами, строк вида 1, 01, 001 и так далее) цифры в номере можно разделить на группы, получив, например, такие номера как "2.00.00" из 20000 или "0-0-0-2" из 2. Для этой цели в xsl:number используется пара атрибутов grouping-separator и grouping-size.

Атрибут grouping-separator задает символ, который следует использовать для разбивки номера на группы цифр, в то время как grouping-size указывает размер группы. Эти атрибуты всегда должны быть вместе: если хотя бы один из них опущен, второй просто игнорируется.

Атрибут ordinal задает строку, которая будет использоваться как окончания в порядковых числительных, например, для английского языка 1st, 2nd, 3rd, 4th, . Допустимые окончания порядковых задаются в значении атрибута в виде списка, элементы которого отделяются друг от друга пробелами, причем каждый элемент начинается с символа "~", например, "~ый ~ой ~ий ~ая ~ое ~ые ". Реализация процессора XSLT может обеспечивать правильную подстановку окончаний порядковых числительных с учетом значений атрибутов lang и format. Если процессор такой возможности не обеспечивает, вместо порядковых выводятся количественные числительные.

3.3.11. Переменные и параметры в XSLT

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

3.3.11.1. Переменные в XSLT

Переменные в XSLT не могут быть изменены, т.е. фактически они эквиваленты переменным с модификатором const в C или переменным с модификатором final в Java. По этой причине в XSLT нет оператора присваивания, а переменные и параметры только инициализируются при объявлении.

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

<xsl:variable

 name="имя"

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

 as="тип-переменной"

>

<!--

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

-->  

</xsl:variable>

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

Необязательный атрибут as задает тип переменной (один из типов XPath).

Значение присваиваемого выражения вычисляется в зависимости от того, как был определен элемент xsl:variable:

  •  если в элементе xsl:variable определен атрибут select, то значением присваиваемого выражения будет результат вычисления выражения, указанного в этом атрибуте;
  •  если атрибут select не определен, но сам элемент xsl:variable имеет дочерние узлы (иными словами, содержит шаблон), значением определяемой переменной будет результирующий фрагмент дерева, полученный в результате выполнения содержимого xsl:variable;
  •  если атрибут select не определен и при этом сам элемент xsl:variable пуст, значением параметра по умолчанию будет пустая строка.

Использовать значения, присвоенные переменным при инициализации, можно, указывая впереди имени переменной символ "$", например для переменной x$x.

Имя переменной соответствует синтаксическому правилу QName, т.е. может иметь вид имя или префикс:имя. Как правило, имена переменным даются без префиксов, однако в том случае, если префикс все же указан, переменная ассоциирует с некоторым объектом не простое, а расширенное имя. Соответственно, обращение к объекту должно будет производиться также посредством расширенного имени.

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

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

В терминах XPath область видимости локальной переменной будет определяться выражением

following-sibling:node()/descendant-or-self:node().

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

  •  имена двух глобальных переменных могут совпадать в том и только том случае, когда они имеют разный порядок импорта. Например, если переменные с одинаковыми именами определены в разных преобразованиях, одно из них может быть импортировано. В этом случае переменная будет иметь значение, которое задано элементом xsl:variable со старшим порядком импорта.
  •  допускается совпадение имен локальной и глобальной переменных – в этом случае в области видимости локальной переменной будет использоваться локальное значение, в области видимости глобальной (но не локальной) – глобальное значение.
  •  две локальные переменные могут иметь совпадающие имена в том и только том случае, если их области видимости не пересекаются.

Переменные в XSLT используются в следующих основных случаях:

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

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

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

<xsl:call-template

name="имя">

 <!--

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

 -->

</xsl:call-template>

Обязательный атрибут name указывает имя правила шаблона, который вызывается этой инструкцией. Например, правило шаблона с именем "head", приведенное выше, может быть вызван следующим образом:

<xsl:call-template name="head"/>.

При вызове xsl:call-template не изменяет контекста преобразования, Фактически, вызов именованного правила шаблона эквивалентен замене в тексте преобразования элемента xsl:call-template на тело вызываемого шаблона.

Если именованное правило шаблона имеет атрибут match, то  его можно вызывать как с помощью  элемента xsl:apply-templates, так и с помощью элемента xsl:call-template.

Между вызовом  правила шаблона с помощью элемента  xsl:apply-templates и с помощью элемента  xsl:call-template существуют следующие основные отличия:

  •  элемент xsl:apply-templates применяет подходящие правила шаблона к узлам определенного множества, а xsl:call-template просто выполняет тело фиксированного именованного правила шаблона;
  •  при вызове правила шаблона инструкцией xsl:apply-templates происходит изменение контекста – обрабатываемое множество узлов становится текущим списком узлов преобразования, а обрабатываемый узел – текущим  узлом, а xsl:call-template не изменяет контекст преобразования;
  •  элемент xsl:apply-templates позволяет использовать различные режимы, а элемент xsl:call-template выполняет правило шаблона с заданным именем вне зависимости от того, в каком режиме происходит обработка и каково значение атрибута mode этого правила;
  •  если для обработки определенного узла подходит несколько правил шаблона, то при выполнении xsl:apply-template процессор будет выбирать наиболее подходящий из них, а для xsl:call-template всегда будет выполнять то единственное правило преобразования, который имеет указанное имя;
  •  если в преобразовании не определено правило шаблона для обработки некоторого узла, но к нему элементом xsl:apply-templates все же применяются правила шаблона (процессор будет использовать правило обработки по умолчанию), а если элемент xsl:call-template вызывает отсутствующий шаблон, процессор выдаст сообщение об ошибке, потому что не сможет найти правило с заданным именем;
  •  при использовании xsl:apply-templates процессор игнорирует значения атрибутов name элементов xsl:template, а при использовании xsl:call-template принимает во внимание только значение атрибута name, игнорируя атрибуты match, mode и priority.

3.3.11.3. Параметры в XSLT

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

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

Работа с параметрами обеспечивается двумя элементами: xsl:param, который объявляет в правиле шаблона новый параметр и xsl:with-param, который указывает значение параметра при вызове правила.

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

<xsl:param

name="имя"

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

as="тип-переменной"

required="yes" | "no"

  tunnel="yes" | "no"

>

 <!--

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

-->

</xsl:param>

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

Элемент xsl:param объявляет параметр с именем, которое задается обязательным атрибутом name. Имя параметра может иметь расширенную форму, например "user:param", но обычно параметрам дают простые имена. Все остальные атрибуты являются необязательными.

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

Необязательный атрибут as задает тип переменной (один из типов XPath).

Атрибут required задает тип параметра: обязательный ("yes") или необязательный ("no").  Если параметр является параметром функции, то он по умолчанию является обязательным и атрибут required задавать не надо.

Атрибут tunnel задает, является ли параметр туннельным ("yes") или нет ("no"). Туннельный параметр автоматически передается вызванным шаблоном тому шаблону, который, в свою очередь вызывается вызванным шаблоном. По умолчанию значение этого атрибута равно "no".

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

  •  если в элементе xsl:param определен атрибут select, то значением по умолчанию будет результат вычисления выражения, указанного в этом атрибуте;
  •  если атрибут select не определен, но сам элемент xsl:param имеет дочерние узлы, то значением определяемого параметра по умолчанию будет фрагмент дерева, полученного в результате выполнения содержимого xsl:param;
  •  если атрибут select не определен и при этом сам элемент xsl:param пуст, то значением параметра по умолчанию будет пустая строка.

Точно так же, как и в случае с переменными, значение заданного в правиле шаблона параметра можно использовать в выражениях, добавляя перед именем параметра префикс "$". К примеру, значение параметра x может быть получено с помощью обращения $x.

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

Для того чтобы передать в правило шаблона определенные значения параметров, элементы, которые вызывают этот шаблон, должны содержать один или несколько элементов xsl:with-param. Глобальные параметры, объявленные элементами xsl:param верхнего уровня, также могут быть переданы преобразованию, однако конкретный механизм реализации этой передачи целиком и полностью зависит от реализации конкретного процессора.

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

<xsl:with-param

name="имя"

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

 as="тип-переменной"

  tunnel="yes" | "no"

>

 <!--

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

--> 

</xsl:with-param>

Как видно из синтаксиса, элемент xsl:with-param идентичен элементу xsl:param (отличаются только их имена). Действуют они также практически одинаково: элемент xsl:with-param тоже связывает с именем параметра значение, и при выполнении шаблона это значение будет использоваться вместо значения параметра по умолчанию.

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

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

Элемент xsl:with-param может использоваться только в качестве дочернего элемента xsl:apply-templates и xsl:call-template.

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

3.4. Выполнение преобразований документов в XMLSpy

Программа XMLSpy 2006 Home Edition (в дальнейшем XMLSpy) предоставляет удобные средства для создания файла преобразования XSLT, выполнения преобразования и просмотра результата преобразования документов XML.

3.4.1. Создание документа XSLT

Для создания файла документа XSLT надо нажать кнопку на панели инструментов или выполнить команду New в меню File. В открывшемся окне выбирается тип документа (XSLT Stylesheet v2.0 с расширением  .xslt) (рис. 4.5.1) и нажимается кнопка OK.

Рис. 4.5.1. Выбор типа документа для преобразования XSLT 2.0

Затем в окне Create new XSL/XSLT file (рис. 4.5.2) выбрать третью радиокнопку.

Рис. 4.5.2. Выбор метода создания преобразования XSLT

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

В начальном окне содержатся: пролог документа XML, начальный и конечный теги элемента xsl:stylesheet и элемент xsl:output. Перед началом ввода преобразований необходимо изменить значение атрибута encoding в элементе xsl:output на "windows-1251".

Элементы преобразования XSLT вводятся после элемента xsl:output.

 

Рис. 4.5.3. Редактор и панели для создания и редактирования преобразования XSLT

Слева в окне ввода и редактирования преобразования XSLT размещены три панели:

  •  панель элементов HTML (XHTML) и XSLT (Elements);
  •  панель атрибутов для элемента HTML (XHTML) или XSLT, на котором установлен курсор  (Attributes);
  •  панель сущностей  HTML (XHTML) (Entities).

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

После ввода  преобразования XSLT его можно сохранить на диске с помощью команды Save As меню File как файл с расширением .xslt.

3.4.2. Выполнение преобразования XSLT

После окончания редактирования преобразования XSLT его можно выполнить с помощью кнопки на панели инструментов, либо при выборе команды XSL Transformation в меню XSL/XQuery, либо с помощью клавиши F10.

При выполнении запроса сначала открывается окно задания документа XML для запроса (рис. 4.5.4).

Рис. 4.5.4. Окно определения документа XML для преобразования XSLT

Документ XML для преобразования можно определить, просто задав его имя в поле Choose a file. Для выбора документа с помощью окна Windows Открыть надо нажать кнопку Browse, выделить документ и нажать кнопку Открыть. Если документ уже открыт в одном из окон  XMLSpy, его можно выбрать, нажав на кнопку Window, выделить нужный файл и нажать кнопку OK (рис. 4.3.6).

Рис. 4.5.5. Окно выбора документа XML для преобразования

После выбора документа XML для выполнения преобразования нажимается кнопка OK.    

Если преобразование содержит ошибки, то в нижней части редактора выводится текст сообщения об ошибке, в противном случае открывается новое окно с именем  XSL Output.html, в котором выводится результат преобразования.

При необходимости с помощью команды Save As меню File документ  – результат запроса можно сохранить с другим именем  на диске.

Просмотреть полученный документ в текстовом виде можно либо при выборе команды Text view меню View в XMLSpy, либо при нажатии кнопки Text в левом нижнем углу окна вывода документа XSL Output.html.

Просмотреть полученный документ как документ XML или HTML (XHTML) можно либо при выборе команды Browser view меню View в XMLSpy, либо при нажатии кнопки Browser в левом нижнем углу окна вывода документа XSL Output.html, либо в Web-браузерах Internet Explorer или Firefox.

4. Порядок выполнения работы

Создайте преобразования XSLT для документа XML вашего варианта, созданного в  лабораторной работы 4-01 и измененного в лабораторной работе 4-02.  

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

Вариант 5-01

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по фамилии первого автора):

  •  <new-newspaper> (новое описание газеты) – корневой элемент;
  •  <name>  (имя) –  элемент второго уровня с текстовым содержимым – наименованием газеты;
  •  <date> (дата) – элемент  второго уровня с атрибутом period (периодичность)  и текстовым содержимым – датой выпуска газеты;
  •  <article>  (статья) –  элемент второго уровня;
  •  <section> (раздел) – элемент  третьего уровня с текстовым содержимым – наименованием раздела статей;
  •  элементы <headline>, <author>, <resume> и <story> копируются в выходной документ без изменений;
  •  <paragraph> (абзац статьи) – элемент  четвертого уровня с текстовым содержимым (без атрибута).

2. Преобразуйте исходный документ XML в документ HTML, содержащий выборку статей заданного автора. В документе HTML выводится общее количество найденных статей и, для каждой найденной статьи, раздел,  наименование и резюме (с использованием поясняющих надписей и стилей CSS). Выводимые книги должны быть отсортированы по разделам.  

Вариант 5-02

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по именам пакетов):

  •  <new-packet-list> (список пакетов) – корневой элемент;
  •  <list-name> (имя списка пакетов) – элемент второго уровня    с текстовым содержимым – именем списка пакетов;
  •  <packet> (пакет) – элемент второго уровня;
  •  <name> (имя) – элемент  третьего уровня с текстовым содержимым – именем пакета;
  •  <description> (описание пакета) – элемент  третьего уровня с текстовым содержимым – описанием пакета;
  •  <interface-list> (список интерфейсов пакета) – элемент третьего уровня, содержащий несколько элементов <interface>;
  •  <interface> (интерфейс) – элемент четвертого уровня;
  •  <name> (имя) – элемент пятого уровня с текстовым содержимым – именем интерфейса;
  •  <description> (описание) – элемент  пятого уровня с текстовым содержимым – описанием интерфейса;
  •  <class-list> (список классов пакета) – элемент третьего уровня, содержащий несколько элементов <class>;
  •  <class> (класс пакета) – элемент четвертого уровня;
  •  <name> (имя) – элемент пятого уровня с текстовым содержимым – именем класса;
  •  <description> (описание) – элемент  пятого уровня с текстовым содержимым – описанием класса;
  •  <exception-list> (список исключений пакета) – элемент третьего уровня, содержащий несколько элементов <exception>;
  •  <exception> (исключение пакета) – элемент четвертого уровня с атрибутом name (именем исключения);
  •  <error-list> (список ошибок пакета) – элемент третьего уровня, содержащий несколько элементов <error>;
  •  <error> (ошибка пакета) – элемент четвертого уровня;
  •  <name> (имя) – элемент пятого уровня с текстовым содержимым – именем наименованием ошибки;
  •  <description> (описание) – элемент  пятого уровня с текстовым содержимым – описанием ошибки.

2. Преобразуйте исходный документ XML в документ HTML, содержащий характеристики пакетов, начинающихся на заданную букву. В документе HTML выводится общее количество найденных пакетов и, для каждого найденного пакета, его имя,  описание, а также списки наименований интерфейсов, классов, исключений и ошибок (с использованием поясняющих надписей и стилей CSS). Выводимые пакеты должны быть отсортированы по своим именам.

Вариант 5-03

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по именам разделов):

  •  <new-article-list> (список статей) – корневой элемент;
  •  <article> (статья) –  элемент второго уровня с атрибутом receiving-date> (дата принятия статьи) и текстовым содержимым – наименованием статьи;
  •  <section> (раздел) – элемент третьего уровня с текстовым содержимым – наименованием раздела;
  •  <author>  (автор статьи) –  элемент третьего уровня с текстовым содержимым (имя, фамилия и отчество) (у статьи может быть несколько авторов);
  •  <annotation> (аннотация) – элемент  третьего уровня с текстовым содержимым;
  •  <content> (содержимое статьи) – элемент  третьего уровня;
  •  <section> (раздел содержимого) – элемент  четвертого уровня с текстовым содержимым – наименованием раздела;
  •  <subsection> (подраздел раздела содержимого) – элемент  пятого уровня с текстовым содержимым – наименованием подраздела;
  •  <paragraph> (абзац подраздела статьи) – элемент шестого уровня с текстовым содержимым.

2. Преобразуйте исходный документ XML в документ HTML, содержащий характеристики статей с заданной строкой в аннотации. В документе HTML выводится общее количество найденных статей и, для каждой найденной статьи, ее раздел, наименование, авторов и аннотацию (с использованием поясняющих надписей и стилей CSS). Выводимые пакеты должны быть отсортированы по первому автору статьи.

 

Вариант 5-04

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по наименованиям торговой марки компьютеров):

  •  <new-computer-list> (список компьютеров) – корневой элемент;
  •  <computer> (компьютер) – элемент второго уровня;
  •   <trade-mark> (торговая марка) –  элемент третьего уровня с текстовым содержимым – наименованием торговой марки;
  •  <processor>  (процессор) –  элемент третьего уровня с атрибутом trade-mark (марка процессора);
  •  <motherboard> (материнская плата) – элемент  третьего уровня с атрибутом trade-mark (марка платы);
  •  элементы <hard-drive-list>, <floppy-drive> и <CD-drive-list> копируются в выходной документ без изменений;
  •  <display> (дисплей) – элемент  третьего уровня с атрибутами trade-mark (торговая марка), size (размер экрана) и max-resolution (максимальное разрешение экрана);
  •  элементы <keyboard>, <mouse> и <addon-device-list> копируются в выходной документ без изменений. 

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

Вариант 5-05

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по наименованиям жанра):

  •  <new-book-list> (список книг) – корневой элемент;
  •  <book> (книга) – элемент второго уровня с атрибутом edition-index (номер издания) и текстовым содержимым – наименованием книги;
  •  <genre> (жанр) –  элемент третьего уровня с текстовым содержимым – наименованием жанра;
  •  <author>  (автор книги) –  элемент третьего уровня с текстовым содержимым (имя, фамилия отчество) (у книги может быть несколько авторов);
  •  <publisher> (издатель книги) – элемент  третьего уровня;
  •  <name> (наименование издательства)  – элемент  четвертого уровня  с текстовым содержимым – наименованием издательства;
  •   <address> (адрес издательства) – элемент  четвертого уровня  с текстовым содержимым – адресом издательства;
  •  <year> (год издания книги) – элемент  четвертого уровня с текстовым содержимым – годом издания книги;
  •  элементы <content>, <section>, <section>, <chapter> и <paragraph> копируются в выходной документ без изменений.

2. Преобразуйте исходный документ XML в документ HTML, содержащий характеристики книг заданного издательства. В документе HTML выводится общее количество найденных книг и, для каждой найденной книги, ее жанр, авторов, наименование, год и номер (с использованием поясняющих надписей и стилей CSS). Выводимые книги должны быть отсортированы по годам издания.

Вариант 5-06

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по наименованиям специальностей):

  •  <new-manual-list> (список учебников) – корневой элемент;
  •  <manual> (учебник) – элемент второго уровня с атрибутом specialty (специальность);
  •  <title> (наименование учебника) с текстовым содержимым – наименованием учебника;
  •  <edition-index> (номер издания) с текстовым содержимым – номером издания;
  •  <author>  (автор учебника) –  элемент третьего уровня с текстовым содержимым (имя, фамилия и отчество) (может быть несколько авторов);
  •  <annotation> (аннотация) – элемент  третьего уровня с текстовым содержимым;
  •  <content> (содержимое учебника) – элемент  третьего уровня;
  •  <lesson> (урок в содержимом) – элемент  четвертого уровня с атрибутом  title – наименованием урока;
  •  <section> (раздел урока) – элемент пятого уровня с атрибутом  title – наименованием раздела;
  •  элементы <paragraph>, <question-list>, <question>, <exercise-list> и <exercise> копируются в выходной документ без изменений.

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

Вариант 5-07

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по наименованиям производителей):

  •  <new-catalog> (каталог товаров) – корневой элемент;
  •  <title> (наименование) – элемент второго уровня c текстовым содержимым – наименованием каталога;
  •  <product>  (товар) –  элемент второго уровня c текстовым содержимым – наименованием товара,  атрибутом category (категория: значения "artisan" – ручная  работа или "factory" – фабричный)
  •  <producer> (производитель) – элемент  третьего уровня с текстовым содержимым – наименованием производителя;
  •  <specification> (спецификация товара) – элемент  третьего уровня с текстовым содержимым – спецификацией товара;
  •  <options> (дополнительные сведения о товаре) – элемент  третьего уровня;
  •  <price> (цена товара) – элемент  третьего уровня;
  •  <purchase> (оптовая цена) – элемент четвертого уровня с текстовым содержимым – оптовой ценой товара;
  •  <sale> (розничная цена) – элемент четвертого уровня с текстовым содержимым – розничной ценой товара;
  •  <inventory> (сопровождение товара) – элемент третьего уровня с атрибутами sale-number (количество проданного товара), store-number (количество товара на складе) и request-number (количество заказанного товара);

2. Преобразуйте исходный документ XML в документ HTML, содержащий характеристики товара заданного производителя. В документе HTML выводится общее количество найденных товаров и, для каждого найденного товара, его наименование, спецификация, розничная цена и количество проданного товара (с использованием поясняющих надписей и стилей CSS). Выводимые товары должны быть отсортированы по своим наименованиям.

Вариант 5-08

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по ФИО авторов):

  •  <new-task-list> (список заданий) – корневой элемент;
  •  <task> (задание) – элемент второго уровня;
  •   <deadline> (срок выполнения задания) – элемент третьего уровня с текстовым содержимым – крайним сроком выполнения задания;
  •  <fio>  (фамилия, имя и отчество студента) –  элемент третьего уровня с текстовым содержимым – ФИО студента;
  •  <theme> (тема) – элемент  третьего уровня с текстовым содержимым – наименованием темы;
  •  <annotation> (аннотация работы) – элемент  третьего уровня с атрибутами sections (количество разделов) и graphics (количество плакатов);  
  •  <calendar-plan> (календарный план) – элемент  третьего уровня;
  •  <calendar-plan-item (пункт календарного плана) – элемент  четвертого уровня с атрибутом section (имя пункта плана)
  •  <begin-date> (дата начала выполнения пункта) – элемент  пятого уровня с текстовым содержимым – датой начала выполнения пункта; 
  •  <end-date> (дата окончания выполнения пункта) – элемент  пятого уровня с текстовым содержимым – датой окончания выполнения пункта.

2. Преобразуйте исходный документ XML в документ HTML, содержащий темы работы студентов с заданной строкой в наименовании темы.  В документе HTML выводится общее количество найденных тем и, для каждой найденной темы, ее наименование, автор, консультанты и разделы, по которым они консультируют (с использованием поясняющих надписей и стилей CSS). Выводимые темы должны быть отсортированы по срокам выполнения заданий.

Вариант 5-09

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по классам, в которых они используются):

  •  <new-methods-list> (список методов) – корневой элемент;
  •  <name> (наименование справочника) –  элемент второго уровня с текстовым содержимым – наименованием справочника;
  •  <method> (метод) – элемент  второго уровня; с атрибутом
  •  <name>  (имя метода) – элемент третьего уровня с текстовым содержимым – именем метода;
  •  <description> (краткое описание метода) – элемент  третьего уровня с текстовым содержимым – кратким описанием метода;
  •  <version> (версия Java, в которой впервые появился метод) – элемент третьего уровня с атрибутом value  – номером версии;
  •  <class> (класс, в котором определен метод) – элемент  уровня с атрибутом name – именем класса;
  •  <modifiers> (модификаторы метода) – элемент  третьего уровня с атрибутом value – модификатором метода, а также атрибутом static;
  •  <return-value-type> (тип возвращаемого значения) – элемент  третьего уровня с атрибутом value  – типом возвращаемого значения;
  •  элементы  <parameter-list>, <parameter>, <parameter-type>, <parameter-identifier> и <exception-list> копируются в выходной документ без изменений.

2. Преобразуйте исходный документ XML в документ HTML, содержащий методы Java, начинающиеся на заданную букву.   В документе HTML выводится общее количество найденных методов и, для каждого найденного метода, его имя, класс, количество параметров, тип возвращаемого значения и версия (с использованием поясняющих надписей и стилей CSS). Выводимые методы должны быть отсортированы по именам.

Вариант 5-10

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по наименованиям тем):

  •  <new-diploma-list> (список дипломов) – корневой элемент;
  •  <diploma> (диплом) – элемент второго уровня;
  •  <fio>  (фамилия, имя и отчество студента) –  элемент третьего уровня с текстовым содержимым – фамилией и инициалами имени и отчества студента;
  •  <theme> (тема) – элемент  третьего уровня с текстовым содержимымнаименованием темы и атрибутом specialty (специальность);
  •  <task> (задание на работу) – элемент  третьего уровня с атрибутом end-date (датой окончания выполнения работы) и текстовым содержимым – кратким изложением задач, решаемых в работе;
  •  <annotation> (аннотация работы) – элемент  третьего уровня;
  •  <page-number> (количество страниц) – элемент  четвертого уровня с  текстовым содержимым – количеством страниц в работе;
  •  <figure-number> (количество рисунков) – элемент  четвертого уровня с  текстовым содержимым – количеством рисунков в работе;
  •  <table-number> (количество таблиц) – элемент  четвертого уровня с  текстовым содержимым – количеством таблиц в работе;
  •  <source-number> (количество источников) – элемент  четвертого уровня с  текстовым содержимым – количеством источников в работе;
  •  <content> (содержание работы) – элемент  третьего уровня;
  •  элементы <preface>, <section>, <second-level-section>, <conclusion>, <source-list> и <source> копируются в выходной документ без изменений.

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

Вариант 5-11

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по фамилиям преподавателей):

  •  <new-study-table> (расписание занятий) – корневой элемент;
  •  <department>  (факультет) –  элемент второго уровня с атрибутом name – наименованием факультета;
  •  <group> (группа) – элемент  второго уровня с атрибутом name – наименованием группы;
  •  <teacher-list> (список преподавателей) – элемент  второго уровня;
  •  <teacher> (преподаватель) – элемент  третьего уровня с атрибутами name типа  id (идентификатор преподавателя) и fio – фамилией и инициалами имени и отчества преподавателя;
  •  <subject-list> (список дисциплин) – элемент  второго уровня;
  •  <subject> (дисциплина) – элемент  третьего уровня с атрибутами name типа  id   (идентификатор дисциплины) и value – наименованием дисциплины;
  •  <time-slot-list> (список промежутков времени) – элемент  второго уровня;
  •  <time-slot> (промежуток времени) – элемент  третьего уровня с текстовым содержимым  типа  id, содержащим время начала и окончания занятия;
  •  <classroom-list> (список учебных аудиторий) – элемент  второго уровня;
  •  <classroom> (учебная аудитория) – элемент  третьего уровня с  атрибутами: room типа id (идентификатор аудитории) и текстовое содержимое – номер аудитории;
  •  элемент <content> и все содержащиеся в нем элементы копируются в выходной документ без изменения.  

2. Преобразуйте исходный документ XML в документ HTML, содержащий расписание на заданный день недели.   В документе HTML выводится общее количество найденных занятий и, для каждого найденного занятия, его предмет, промежуток времени, группа и преподаватель (с использованием поясняющих надписей и стилей CSS). Выводимые методы должны быть отсортированы по промежуткам времени.

Вариант 5-12

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по специальностям):

  •  <new-study-subject-list> (список дисциплин) – корневой элемент;
  •  <study-subject> (дисциплина) – элемент  второго уровня;
  •  <name> (наименование дисциплины) – элемент  третьего уровня с атрибутом fio – фамилией и инициалами преподавателя, атрибутом end-date – датой  окончания составления программы и  с текстовым содержимым – наименованием дисциплины;
  •  <specialty> (специальность, по которой проходит дисциплина) – элемент  третьего уровня с   атрибутом value – значением специальности;
  •  элементы <general-information>, <aims-and-goals>, <plan> и <study-list> копируются в выходной документ без изменения;
  •  <lecture> (лекция) – элемент  пятого уровня;
  •   <theme> (тема лекции) – элемент  шестого уровня с  текстовым содержимым – темой лекции;
  •  <question> (вопрос, рассматриваемый в лекции) – элемент  шестого уровня с  текстовым содержимым – кратким описанием вопроса, рассматриваемого в лекции;
  •  <practice> (практическое занятие) – элемент  пятого уровня;
  •  <theme> (тема практического занятия) – элемент  шестого уровня с  текстовым содержимым – темой практического занятия;
  •  <question> (вопрос, рассматриваемый в практическом занятии) – элемент  шестого уровня с  текстовым содержимым – кратким описанием вопроса, рассматриваемого в практическом занятии;
  •  <seminar> (семинарское занятие) – элемент  пятого уровня;
  •  <theme> (тема семинарского занятия) – элемент  шестого уровня с  текстовым содержимым – темой семинарского занятия;  
  •  <question> (вопрос, рассматриваемый в семинарском занятии) – элемент  шестого уровня с  текстовым содержимым – кратким описанием вопроса, рассматриваемого в семинарском занятии;
  •  элементы <lab>, <methodic>, <source-list> и <source> копируются в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий рабочие программы по заданной специальности.   В документе HTML выводится общее количество найденных программ и, для каждой найденной программы, ее наименование, фамилия и инициалы преподавателя, дата  окончания составления программы, общие сведения, а также  цели и задачи дисциплины (с использованием поясняющих надписей и стилей CSS). Выводимые программы должны быть отсортированы по фамилиям преподавателей.

Вариант 5-13

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по классам, в которых определено поле):

  •  <field-list> (список полей) – корневой элемент;
  •  <name> (наименование справочника) –  элемент второго уровня с текстовым содержимым – наименованием справочника;
  •  <field> (поле) – элемент  второго уровня с атрибутом version (версия Java, в которой впервые появилось поле);
  •  <name> – (имя) – элемент  третьего уровня с текстовым содержимым – именем поля;
  •  <description> (описание поля) – элемент  третьего уровня с текстовым содержимым – кратким описанием поля; 
  •  <class> (класс, в котором определено поле) – элемент  третьего уровня с текстовым содержимым – именем класса;
  •  <type> (тип поля) – элемент  третьего уровня с текстовым содержимым – типом данных для поля;
  •  <static> (статическое поле) – элемент  третьего уровня с текстовым содержимым,  которое имеет либо значение "yes", либо значение "no";
  •  <protected> (защищенное поле) – элемент  третьего уровня с текстовым содержимым,  которое имеет либо значение "yes", либо значение "no";
  •  <value> (значение поля) – элемент  третьего уровня с текстовым содержимым – значением поля.

2. Преобразуйте исходный документ XML в документ HTML, содержащий поля для заданного класса.   В документе HTML выводится общее количество найденных полей и, для каждого найденного поля, его имя, описание, тип и значение (с использованием поясняющих надписей и стилей CSS). Выводимые программы должны быть отсортированы по именам полей.

Вариант 5-14

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по времени вылета):

  •  <new-airport-table> (расписание полетов) – корневой элемент;
  •  <airport-list> (список аэропортов назначения) – элемент  второго уровня;
  •  <airport> (аэропорт назначения) – элемент  третьего уровня с текстовым содержимым – наименованием аэропорта;
  •  <airplane-type-list> (список типов самолетов) – элемент  второго уровня;
  •  <airplane-type> (тип самолета) – элемент  третьего уровня с текстовым содержимым – типом самолета;
  •  элементы <current-airport>, <date> и <airplane-table> копируются в выходной документ без изменения;
  •  <number> (номер рейса) – элемент  четвертого уровня с атрибутом value – номером рейса;
  •  <departure> (время вылета) – элемент  четвертого уровня с атрибутом  time – значением времени вылета;
  •  <arrival> (время прилета в аэропорт назначения) – элемент  четвертого уровня с атрибутом  time – значением времени прилета;
  •  <airplane-ref> (ссылка на тип самолета) – элемент  четвертого уровня с атрибутом  ref типа IDREF.

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

Вариант 5-15

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами:

  •  <new-report> (отчет) – корневой элемент;
  •  <theme> (тема) – элемент  второго уровня с атрибутом end-date – датой окончания выполнения отчета и с текстовым содержимым – наименованием темы; 
  •  <author-list> (список исполнителей отчета) – элемент второго уровня;
  •  <author> (исполнитель отчета) – элемент  третьего уровня;
  •  <fio> (фамилия и инициалы исполнителя) – элемент  четвертого уровня с текстовым содержимым – фамилией и инициалами исполнителя;
  •  <status> (должность) – элемент  четвертого уровня с текстовым содержимым – должностью исполнителя;
  •  <sections> (разделы) – элемент  четвертого уровня с текстовым содержимым – списком идентификаторов разделов, в написании которых   принимал участие исполнитель;
  •  <annotation> (аннотация работы) – элемент  второго уровня;
  •  <page-number> (количество страниц) – элемент  третьего уровня с текстовым содержимым – количество страниц в работе;
  •  <figure-number> (количество рисунков) – элемент  третьего уровня с текстовым содержимым – количество рисунков в работе;
  •  <table-number> (количество таблиц) – элемент  третьего уровня с текстовым содержимым – количество таблиц в работе;  
  •  <source-number> (количество) – элемент  третьего уровня с текстовым содержимым – количество источников в работе;
  •  <text> (текст аннотации) – элемент  третьего уровня с текстом аннотации;
  •  элемент <content>и все его дочерние элементы копируются в выходной документ без изменения.

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

Вариант 5-16

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по именам классов):

  •  <new-class-list> (список классов) – корневой элемент;
  •  <name>  (наименование справочника) –  элемент второго уровня с текстовым содержимым – наименованием справочника;
  •  <class> (класс) – элемент  второго уровня с атрибутами name – именем класса и version – версией Java, в которой впервые появился класс;
  •  <description> (краткое описание класса) – элемент  третьего уровня с текстовым содержимым – кратким описанием класса;
  •  <modifiers> (модификаторы класса) – элемент  третьего уровня;
  •  <static> (статический класс) – элемент  четвертого уровня, который имеет  либо значение "yes", либо значение "no";
  •  <final> (финальный класс) – элемент  четвертого уровня, который имеет  либо значение "yes", либо значение "no";
  •  <abstract> (абстрактный класс) – элемент  четвертого уровня, который имеет  либо значение "yes", либо значение "no";
  •  <superclass> (класс-родитель) – элемент  третьего уровня с текстовым содержимым – именем класса-родителя;
  •  Элементы <subclass-list>, <subclass>, <interface-list>, <interface>, <fields-list>, <field>, <methods-list> и <method> копируются в выходной документ без изменений.

2. Преобразуйте исходный документ XML в документ HTML, содержащий классы для заданного класса-родителя.   В документе HTML выводится общее количество найденных классов и, для каждого найденного класса, его имя, описание, класс-родитель, а также количество дочерних классов, интерфейсов, полей и методов (с использованием поясняющих надписей и стилей CSS). Выводимые классы должны быть отсортированы по именам классов.

Вариант 5-17

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по специальностям):

  •  <new-study-subject-list> (список дисциплин) – корневой элемент;
  •  <study-subject> (дисциплина) – элемент  второго уровня с атрибутами end-date (дата окончания составления программы) и fio  (фамилия, имя и отчество преподавателя);
  •  <name> (наименование дисциплины) – элемент  третьего уровня с текстовым содержимым – наименованием дисциплины;
  •  <information> (информация о дисциплине) – элемент  третьего уровня;
  •  <specialty> (специальность, по которой проходит дисциплина) – элемент  четвертого уровня с текстовым содержимым;
  •  <general-information> (общие сведения) – элемент  четвертого уровня с текстовым содержимым – краткими сведениями о дисциплине;
  •  <aims-and-goals> (цели и задачи дисциплины) – элемент  четвертого уровня с текстовым содержимым – кратким описанием целей и задач дисциплины;
  •  Элементы <content>, <methodic> и <source-list> со своими дочерними элементами копируются в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий учебные программы по заданной дисциплине.   В документе HTML выводится общее количество найденных программ и, для каждой найденной программы, ее наименование, общие сведения, цели и задачи дисциплины, а также фамилия, имя и отчество преподавателя (с использованием поясняющих надписей и стилей CSS). Выводимые программы должны быть отсортированы по своим наименованиям.

Вариант 5-18

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по ФИО контрактантов):

  •  <new-contract-list> (список контрактов) – корневой элемент;
  •  <contract> (контракт) – элемент второго уровня с атрибутом results-proprietor – собственник результатов работы;
  •  <title (заголовок контракта) –  элемент третьего уровня с атрибутом date – датой заключения контракта;
  •  <city> (город) –  элемент третьего уровня с текстовым содержимым – местом  заключения контракта;
  •  <director> (заказчик) – элемент  третьего уровня с атрибутами organization – организация и fio – фамилия, имя и отчество заказчика;
  •  <contractor> (контрактант) – элемент  третьего уровня с атрибутами status – должность, на которую принимают контрактанта, fio – фамилия, имя и отчество контрактанта и  month-salary – месячная зарплата; 
  •  <conditions> (условия контракта) – элемент третьего уровня с текстовым содержимым;
  •  элемент  третьего уровня <task-content-list> (список заданий) со своими дочерними элементами копируется в выходной документ без изменения;
  •  <duration> (сроки выполнения работ по контракту) – элемент третьего уровня;
  •  <time-begin> (начальное время) – элемент четвертого уровня с текстовым содержимым – временем начала действия контракта;
  •  <time-end> (конечное время) – элемент четвертого уровня с текстовым содержимым – временем окончания действия контракта.

2. Преобразуйте исходный документ XML в документ HTML, содержащий контракты для заданного ФИО заказчика.   В документе HTML выводится общее количество найденных контрактов и, для каждого найденного контракта, его заголовок, ФИО контрактанта, сроки выполнения работ, месячная зарплата  и условия контракта (с использованием поясняющих надписей и стилей CSS). Выводимые контракты должны быть отсортированы по ФИО контрактанта.

Вариант 5-19

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по именам интерфейсов-родителей):

  •  <new-interface-list> (список интерфейсов) – корневой элемент;
  •  <name>  (наименование справочника) – элемент второго уровня с текстовым содержимым – наименованием справочника;
  •  <letter>  (буква) –  элемент второго уровня с атрибутом value (буква, на которую начинается имя метода);
  •  <interface> (интерфейс) – элемент  третьего уровня;
  •  <name> – элемент  четвертого уровня атрибутом version – версия Java, в которой впервые появился интерфейс и с текстовым содержимым – именем интерфейса;
  •  <description> (описание) – элемент  четвертого уровня с текстовым содержимым – кратким описанием интерфейса;
  •  <modifier> (модификатор интерфейса) – элемент  четвертого уровня с атрибутом value – модификатором интерфейса;
  •  элементы <superinterfaces-list>, <subinterface-list>, <fields-list> и <methods-list> со своими дочерними элементами копируются в выходной документ без изменений.

2. Преобразуйте исходный документ XML в документ HTML, содержащий интерфейсы по заданной строке в описании интерфейса.   В документе HTML выводится общее количество найденных интерфейсов и, для каждой найденного интерфейса, его наименование, списки интерфейсов – родителей данного интерфейса, списки интерфейсов-потомков, списки полей и методов, а также версия Java, в которой впервые появился интерфейс (с использованием поясняющих надписей и стилей CSS). Выводимые интерфейсы должны быть отсортированы по своим именам.

Вариант 5-20

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по портам назначения):

  •  <new-TCP-packet-list> (набор пакетов TCP) – корневой элемент;
  •  <TCP-packet> (пакет TCP) – элемент  второго уровня с атрибутами source-port – порт источника и destination-port – порт назначения;
  •  <header> (заголовок пакета) – элемент  третьего уровня;
  •  <parameters> (параметры пакета) – элемент  четвертого уровня с атрибутом sequence-number – порядковым номером пакета;
  •  <acknowledgment-number> (номер подтверждения пакета) – элемент  пятого уровня с текстовым содержимым – номером подтверждения пакета;
  •  <data-offset> (смещение данных) – элемент  пятого уровня с текстовым содержимым – смещением данных;
  •  <reserved-field> (зарезервированное поле) – элемент  пятого уровня с текстовым содержимым – значением зарезервированного поля;
  •  элемент <flags> (флажки) со своими дочерними элементами, элементы <window>, <checksum>, <urgent-pointer>, <option-list> (со своими дочерними элементами) и элемент <data> копируются в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий пакеты TCP для заданного порта назначения.   В документе HTML выводится общее количество найденных пакетов и, для каждого найденного пакета, его порт источника, порядковый номер пакета, значения флажков, а также данные пакета (с использованием поясняющих надписей и стилей CSS). Выводимые пакеты должны быть отсортированы по портам источника.

Вариант 5-21

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по наименованиям работ):

  •  <new-registry-card-list> (список регистрационных карт) – корневой элемент;
  •  <registry-card> (регистрационная карта) – элемент  второго уровня;
  •  <index> (номер регистрации) – элемент   третьего уровня с текстовым содержимым – номером регистрации;
  •  <research-name> (наименование работы) – элемент  третьего уровня с текстовым содержимым – наименованием работы;
  •  <preamble> (преамбула карты) элемент   третьего уровня с атрибутами base – основания проведения работы) и research-type – вид работы; 
  •  <annotation> (аннотация работы) – элемент  третьего уровня с текстовым содержимым;
  •  элементы <requestor> , <section-list> и <contractor> со своими дочерними элементами копируются в выходной документ без изменения.

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

Вариант 5-22

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по наименованиям разделов):

  •  <new-C-standard-library> (стандартная библиотека C) – корневой элемент;
  •  <partition> (раздел библиотеки) – элемент  второго уровня;
  •  <description> (описание) – элемент  третьего уровня с атрибутом  name  – наименованием раздела и с текстовым содержимым – описанием раздела; 
  •  <constant-list> (список именованных констант раздела) – элемент третьего уровня;
  •  <constant> (именованная константа раздела) – элемент  четвертого уровня;
  •  <name> (имя) – элемент пятого   уровня с текстовым содержимым – именем константы;
  •   <description> – элемент пятого   уровня с текстовым содержимым – описанием константы;
  •  элемент <function-list> со своими дочерними элементами копируется в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий функции стандартной библиотеки языка C, начинающиеся на заданную букву.  В документе HTML выводится общее количество найденных функций и, для каждой найденной функции, ее имя, описание функции, тип возвращаемого значения и количество параметров функции (с использованием поясняющих надписей и стилей CSS). Выводимые функции должны быть отсортированы по своим наименованиям.

Вариант 5-23

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по именам классов-родителей):

  •  <new-class-list> (список классов) – корневой элемент;
  •  <class> (класс) – элемент  второго уровня;
  •  <name> – элемент  третьего уровня с атрибутом version – версия Java, в которой впервые появился класс и с текстовым содержимым – именем класса;
  •  <description> (описание класса) – элемент  третьего уровня с текстовым содержимым – описанием класса;
  •  <modifiers> (модификаторы класса) – элемент  третьего уровня с атрибутом value – значением модификатора класса;
  •  <superclass> (класс-родитель) – элемент  третьего уровня с атрибутом name – именем класса-родителя;
  •   элементы <subclass-list>, <interface-list> <fields-list>, и <constructor-list> со своими дочерними элементами копируются в выходной документ без изменения;
  •  <method-list> (список методов класса) – элемент третьего уровня с текстовым содержимым;
  •  <method> (метод класса) – элемент четвертого уровня с обязательным атрибутом name (именем метода) и текстовым значением – модификатором метода; 
  •  <method-parameter> (параметр метода) – элемент пятого уровня;
  •   <name> (имя) – элемент  шестого уровня с текстовым содержимым – именем параметра;
  •   type (тип параметра) – элемент  шестого уровня с текстовым содержимым – типом параметра;
  •  <return-value-type> (тип возвращаемого значения) – элемент  четвертого уровня с текстовым содержимым – типом возвращаемого методом значения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий описание классов языка Java, реализующих заданные интерфейсы.   В документе HTML выводится общее количество найденных классов и, для каждого найденного класса, его имя, значение модификаторов, версия Java, в которой впервые появился класс, имя класса-родителя, а также списки имен полей, конструкторов и методов (с использованием поясняющих надписей и стилей CSS). Выводимые классы должны быть отсортированы по своим именам.

Вариант 5-24

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по длине заголовка):

  •  <new-IP-datagram-list> (список дайтаграмм IP) – корневой элемент;
  •  <IP-datagram> (дайтаграмма IP) – элемент  второго уровня с атрибутами source-addressIP-адрес источника и destination-addressIP-адрес получателя;
  •  <header> (заголовок дейтаграммы) – элемент  третьего уровня с атрибутами version – версия протокола и length – длина заголовка в 32-битовых словах;
  •  <type-of-service> (характеристики обработки дейтаграммы) – элемент  четвертого уровня;
  •  <precedence>  (относительная значимость дейтаграммы) –  элемент пятого уровня с  текстовым содержимым – относительной значимостью дейтаграммы;
  •  <delay> (задержка) – элемент  пятого уровня с  текстовым содержимым – значением задержки;
  •  <throughput> (показатель скорости передачи) – элемент  пятого уровня с  текстовым содержимым – значением показателя скорости передачи;
  •  <reliability> (показатель надежности) – элемент  пятого уровня с  текстовым содержимым – значением показателя надежности;
  •  <reserved> (зарезервированные поля) – элемент  пятого уровня с текстовым содержимым – значением зарезервированных полей;
  •  элемент <total-length>, <identification>, <flags> (со своими дочерними элементами), <fragment-offset>, <time-to-live>, <protocol>, <checksum>, <option-list> (со своими дочерними элементами), <padding> и <data> копируются в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий дейтаграммы протокола IP с заданным IP-адресом источника.   В документе HTML выводится общее количество найденных дейтаграмм и, для каждой найденной дейтаграммы, ее IP-адрес получателя, длина заголовка, общая длина дейтаграммы, время жизни, а также данные дейтаграммы (с использованием поясняющих надписей и стилей CSS). Выводимые дейтаграммы должны быть отсортированы по IP-адресам получателя.

Вариант 5-25

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по ФИО авторов):

  •  <new-task-list> (список заданий) – корневой элемент;
  •  <task> (задание) – элемент второго уровня;
  •   <deadline> (срок выполнения задания) – элемент третьего уровня с текстовым содержимым – крайним сроком выполнения задания;
  •  <fio>  (фамилия, имя и отчество студента) –  элемент третьего уровня с текстовым содержимым – ФИО студента;
  •  <theme> (тема) – элемент  третьего уровня с текстовым содержимым – наименованием темы;
  •  <annotation> (аннотация работы) – элемент  третьего уровня с атрибутами sections (количество разделов) и graphics (количество плакатов);  
  •  <calendar-plan> (календарный план) – элемент  третьего уровня;
  •  <calendar-plan-item (пункт календарного плана) – элемент  четвертого уровня с атрибутом section (имя пункта плана)
  •  <begin-date> (дата начала выполнения пункта) – элемент  пятого уровня с текстовым содержимым – датой начала выполнения пункта; 
  •  <end-date> (дата окончания выполнения пункта) – элемент  пятого уровня с текстовым содержимым – датой окончания выполнения пункта.

2. Преобразуйте исходный документ XML в документ HTML, содержащий темы работы студентов с заданной строкой в наименовании темы.  В документе HTML выводится общее количество найденных тем и, для каждой найденной темы, ее наименование, автор, консультанты и разделы, по которым они консультируют (с использованием поясняющих надписей и стилей CSS). Выводимые темы должны быть отсортированы по срокам выполнения заданий.

Вариант 5-26

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по своим именам):

  •  <new-method-list> (список методов) – корневой элемент;
  •  <method> (метод) – элемент  второго уровня с атрибутом version – версия Java, в которой впервые появился метод;
  •  <name> (имя) – элемент  третьего уровня с атрибутом  return-value-type – тип возвращаемого значения и текстовым содержимым – именем метода;
  •  <class> (класс, в котором определен метод) – элемент  третьего уровня с атрибутом value – именем класса;
  •  <description> (описание метода) – элемент  третьего уровня с текстовым содержимым;
  •  <modifiers> (модификаторы метода) – элемент  третьего уровня с атрибутом value – значением модификаторов метода;
  •  элементы <parameter-list> и <exception-list> со своими дочерними элементами копируются в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий методов языка Java для заданного класса.   В документе HTML выводится общее количество найденных методов и, для каждого найденного метода, его имя, описание, модификаторы, тип возвращаемого значения, а также типы параметров (с использованием поясняющих надписей и стилей CSS). Выводимые методы должны быть отсортированы по типам возвращаемого значения.

Вариант 5-27

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по руководителям работ):

  •  <new-act-list> (список актов) – корневой элемент;
  •  <act> (акт) – элемент  второго уровня;
  •  <title> (заголовок) – элемент  третьего уровня с текстовым содержимым – заголовком акта;
  •  <signing-date> (дата подписания) – элемент  третьего уровня с текстовым содержимым – датой подписания акта;
  •  <preamble> (преамбула акта) – элемент  третьего уровня;
  •  <duration> (период работы) – элемент  четвертого уровня с атрибутами time-begin – время начала выполнения работ, time-end – время окончания выполнения работ) и duration – продолжительностью работы;
  •  <manager> (руководитель работ) – элемент  четвертого уровня с атрибутом name – фамилией и инициалами руководителя работ;
  •  элемент <report-list> со своими дочерними элементами и элемент <total-salary> копируются в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий акты на выполненные работы для заданного руководителя работы.   В документе HTML выводится общее количество найденных актов и, для каждого найденного акта, его заголовок, дату подписания акта, период работы, а также общую сумму выплат (с использованием поясняющих надписей и стилей CSS). Выводимые акты должны быть отсортированы по общим суммам выплат.

Вариант 5-28

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по датам):

  •  <new-tvschedule> (расписание телепрограмм) – корневой элемент с атрибутом title  (наименование телепрограммы); 
  •  <date> (дата расписания) – элемент второго уровня с атрибутами day – день месяца, month – месяц и year – год;
  •  <channel> (телевизионный канал) – элемент второго уровня;
  •  <name> (имя) – элемент третьего уровня с текстовым содержимым – наименованием канала;
  •  <mode> (режим) – элемент третьего уровня с текстовым содержимым – значением режима канала;
  •  элемент <program-slot> со своими дочерними элементами копируется в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий телевизионные программы для заданного канала.   В документе HTML выводится общее количество найденных программ и, для каждой найденной программы, ее наименование, день недели, время начала, а также описание передачи (с использованием поясняющих надписей и стилей CSS). Выводимые программы должны быть отсортированы по временам начала передачи.

Вариант 5-29

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по своим именам):

  •  <new-interface-list> (список интерфейсов) – корневой элемент;
  •  <interface> (интерфейс) – элемент второго уровня;
  •  <name>  (наименование интерфейса) – элемент третьего уровня с текстовым содержимым;
  •  <version> (версия Java, в которой впервые появился интерфейс) – элемент третьего уровня с атрибутом value – значением версии Java; 
  •  <description> (описание интерфейса) – элемент третьего уровня с текстовым содержимым;
  •  <modifier> (модификатор интерфейса) – элемент  третьего уровня с атрибутом value – значением модификатора интерфейса;
  •  <superinterface-list> (список интерфейсов – родителей данного интерфейса) – элемент третьего уровня;
  •  <superinterface> (интерфейс-родитель) – элемент четвертого уровня;
  •  <name> (имя) – элемент пятого уровня с текстовым содержимым – наименованием интерфейса;
  •  <description> (описание) – элемент пятого уровня с текстовым содержимым – описанием интерфейса;
  •   <subinterface-list> (список прямых интерфейсов-потомков) – элемент третьего уровня;
  •  <subinterface> (интерфейс-потомок) – элемент четвертого уровня;
  •  <name> (имя) – элемент пятого уровня с текстовым содержимым – наименованием интерфейса;
  •  <description> (описание) – элемент пятого уровня с текстовым содержимым – описанием интерфейса;
  •  элементы <field-list> и <method-list> со своими дочерними элементами копируется в выходной документ без изменения.

2. Преобразуйте исходный документ XML в документ HTML, содержащий описание интерфейсов языка Java для заданных имен интерфейсов-родителей.   В документе HTML выводится общее количество найденных интерфейсов и, для каждого найденного интерфейса, его имя, описание, модификаторы, версия Java, в которой впервые появился интерфейс,  а также количество интерфейсов-потомков, полей и методов (с использованием поясняющих надписей и стилей CSS). Выводимые интерфейсы должны быть отсортированы по своим модификаторам.

Вариант 5-30

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

1. Преобразуйте исходный документ в новый документ XML со следующими элементами и атрибутами (элементы в выходном документе должны быть отсортированы по специальностям):

  •  <new-games-table> (расписание соревнований) – корневой элемент;
  •  <team-list> (список команд) – элемент  второго уровня;
  •  <team> (команда) – элемент  третьего уровня с текстовым содержимым – наименованием команды;
  •  <time-list> (список времен начала соревнования) – элемент  второго уровня;
  •  <time-begin> (время начала соревнования) – элемент  третьего уровня с   текстовым содержимым – временем начала соревнования;
  •  <competition-place-list> (список мест проведения соревнования) – элемент  второго уровня;
  •  <competition-place> (место проведения соревнования) – элемент  третьего уровня с текстовым содержимым – наименованием места проведения соревнования;  
  •  <competition>  (соревнование) –  элемент второго уровня с атрибутом  name – наименованием соревнования;
  •  <date> (дата проведения соревнования) – элемент  третьего уровня;
  •  <day> (день) – элемент  четвертого уровня  с текстовым содержимым – днем проведения соревнования;
  •  <month> (месяц) – элемент  четвертого уровня  с текстовым содержимым – индексом месяца проведения соревнования;
  •  <year> (год) – элемент  четвертого уровня  с текстовым содержимым – годом проведения соревнования;
  •  элементы <time> , <team1>, <team2> и <place> копируются в выходной документ без изменения.

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

5. Содержание отчета

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

6. Вопросы для самоконтроля

Как выполняется обработка документа XML с использованием XSL? Какие спецификации описывают язык XSL?

Какова технология преобразования документа с помощью XSLT?

Как определяется образец, шаблон и стиль в XSLT?

Как определяется пространство имен XSLT и элементы xsl:stylesheet и xsl:transform?

Как в XSLT определяется совместное использование преобразований и документов XML?

Как в XSLT выполняется преобразование документа с помощью правил шаблона?

Как в XSLT определяется правило шаблона с помощью элемента xsl:template?

Как в XSLT обрабатываются литеральные элементы и инструкции?

Как в XSLT выполняется вызов неименованных правил шаблона?

Как в XSLT выполняется вызов именованных правил шаблона?

Как в XSLT описываются упрощенные преобразования?

Как в XSLT выполняется управление выводом с помощью элемента xsl:output?

Как в XSLT выполняется обработка атрибутов элемента xsl:output при выводе в документ HTML?

Как в XSLT определяется, и какие функции выполняет элемент xsl:element?

Как в XSLT определяется, и какие функции выполняет элемент xsl:attribute?

Как в XSLT определяется атрибут?

Как в XSLT определяется, и какие функции выполняет элемент xsl:text?

Как в XSLT определяется, и какие функции выполняет элемент xsl:value-of?

Какие встроенные правила шаблона определены в XSLT?

Как в XSLT выполняется обработка пробельных символов?

Как в XSLT выполняется создание комментариев и инструкций по обработке?

Как в XSLT выполняется копирование узла с помощью элемента xsl:copy?

Как в XSLT выполняется копирование узла с помощью элемента xsl:copy-of?

Как в XSLT выполняется условная обработка с помощью элемента xsl:if?

Как в XSLT выполняется условная обработка с помощью элемента xsl:choose, xsl:when и xsl:otherwise?

Как в XSLT создаются в выходящем документе повторяемые части структуры с помощью элемента xsl:for-each?

Как в XSLT выполняется сортировка элементов в выходном документе?

Файл: file:///web/1/5fan/public_html/www/files/2/5fan_ru_13957_7c888bab572ae61f404e695caaeca922.doc   Создан: 2008-03-25T17:15:00Z Модифицирован: 2008-03-25T17:15:00Z     Автор:


 

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

58212. Открытое [ɔ] и закрытое [o] во французском языке. Правила чтения 139.5 KB
  Шапка le cours est fini занятие окончено cdeu подарок bureu m письменный стол кабинет бюро контора отдел couteu m нож Прослушайте текст обращая внимание на звук [о]. C’est Mdme Cdet qui fit le cours. Mme Cdet s’dresse ux élèves et dit : Regrdez les mots u tbleu s’il vous plît Estce...
58214. TO BE A REAL FRIEND 321.5 KB
  AIMS: To develop student’s skills in all-round discussion; To practice speaking, reading, listening, writing on the topic; To introduce new words and word combinations and train pupils in using them...
58216. Гражданская оборона, основные понятия, определения и задачи ГО 55.5 KB
  Гражданская оборона система мер направленных на подготовку к защите и защиту населения материальных и культурных ценностей на территории Российской Федерации от опасностей возникающих при ведении военных действий или вследствие этих действий.
58218. Нуклеиновые кислоты 138 KB
  Различают два типа нуклеиновых кислот дезоксирибонуклеиновые сокращенно ДНК и рибонуклеиновые РНК. Различие в названиях объясняется тем что молекула ДНК содержит углевод дезоксирибозу а молекула РНК рибозу.
58219. Пища, полезная для здоровья. Выбор полезной для здоровья пищи 84 KB
  Цель: ознакомить с правилами полноценного питания; формировать понятие правильное питание навыки культурного поведения за столом; развивать память; воспитывать эстетический вкус бережное отношение к здоровью. Оборудование: таблица витаминов...
58220. Права, свободы и ответственность 28 KB
  Патриархальный тип взаимоотношений индивида и власти предполагает сложную иерархию прав и обязанностей людей неравенство их положения в отношениях власти. венчающий пирамиду власти. Индивидуалистический способ взаимоотношений личности и власти основан на приоритете индивида в отношениях с государством.