Алексей Валиков - Технология XSLT
Элементы xsl:stylesheet и xsl:transform
<xsl:stylesheet
id="идентификатор"
extension-element-prefixes="префиксы"
exclude-result-prefixes="префиксы"
version="число">
<!--
Содержимое: несколько элементов xsl:import, элементы верхнего уровня
-->
</xsl:stylesheet>
<xsl:transform id="идентификатор"
extension-element-prefixes="префиксы"
exclude-result-prefixes="префиксы"
version="число">
<!--
Содержимое: несколько элементов xsl:import, элементы верхнего уровня
-->
</xsl:transform>
Элемент xsl:stylesheet имеет обязательный атрибут version, в котором указывается версия языка, использованная при создании этого преобразования. Текущей версией языка является версия 1.0, поэтому все преобразования, которые мы будем приводить в качестве примеров, будут начинаться следующим тегом:
<xsl:stylesheet version="1.0" ... >
Необязательный атрибут id может содержать уникальный идентификатор данного преобразования. Этот атрибут используется в тех случаях, когда преобразование включено в преобразуемый документ для его идентификации внутри этого документа.
ПримерЕсли преобразование, включенное в преобразуемый документ, будет иметь вид
...
<xsl:stylesheet
version="1.0"
id="trans"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:stylesheet>
...
то ассоциироваться с документом оно будет следующей инструкцией:
<?xml-stylesheet type="text/xsl" href="#trans"?>
Необязательный атрибут extension-element-prefixes перечисляет префиксы пространств имен, которые определяют элементы расширения. Об использовании этого атрибута мы расскажем в главе 10, которая посвящена созданию расширений языка XSLT.
Необязательный атрибут exclude-result-prefixes перечисляет префиксы пространств имен, определения которых не нужно включать в выходящий документ. Использование этого атрибута подробно описано в главе 8.
Элемент xsl:stylesheet может включать следующие элементы языка XSLT:
□ xsl:import;
□ xsl:include;
□ xsl:strip-space;
□ xsl:output;
□ xsl:key;
□ xsl:decimal-format;
□ xsl:namespace-alias;
□ xsl:attribute-set;
□ xsl:variable;
□ xsl:param;
□ xsl:template.
Эти элементы называются элементами верхнего уровня, поскольку они могут находиться на самом верхнем (не считая уровня корневого элемента) уровне в иерархии элементов документа. Более того, все перечисленные элементы кроме xsl:variable и xsl:param должны находиться только на верхнем уровне. Элементы xsl:variable и xsl:param могут использоваться в шаблонах, определяя локальные переменные и параметры.
Если преобразование импортирует внешние модули, первыми дочерними элементами xsl:stylesheet должны быть элементы xsl:import. Иначе говоря, элементам xsl:import внутри xsl:stylesheet должны предшествовать только другие элементы xsl:import. Порядок всех остальных дочерних элементов xsl:stylesheet не имеет значения.
Помимо элементов верхнего уровня, xsl:stylesheet может содержать элементы других, но обязательно ненулевых пространств имен. Это позволяет включать в преобразования любую сопутствующую информацию, правда спецификация оговаривает, что такого рода элементы не должны изменять поведение элементов и функций самого XSLT.
Пример Листинг 4.1. Преобразование с элементом верхнего уровня, не принадлежащим XSLT<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<source xmlns="http://www.a.com/XSL/source">
Simple stylesheet
</source>
<xsl:template match="/">
<root/>
</xsl:template>
</xsl:stylesheet>
Выделенный полужирным шрифтом на листинге 4.1 элемент source принадлежит пространству имен с URI http://www.a.com/XSL/source. Поскольку пространство имен этого элемента ненулевое, такое объявление является корректным.
Упрощенные преобразования
Многие простые преобразования состоят из единственного правила, которое обрабатывает корневой узел входящего документа. Общий вид такого рода преобразований показан в следующем листинге.
Листинг 4.2. Простое преобразование<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<result>
<!-- Шаблон -->
</result>
</xsl:template>
</xsl:stylesheet>
XSLT позволяет упрощать запись таких преобразований, опуская элементы xsl:stylesheet и xsl:template и оставляя только шаблон, создающий выходящий документ.
Корневой элемент упрощенной записи должен содержать атрибут xsl:version, указывающий версию языка XSLT, использованного в шаблоне. Как правило, этот элемент также содержит объявление пространства имен XSLT, хотя оно может быть определено и в другом месте.
ПримерПреобразование, приведенное в листинге 4.2, можно переписать в упрощенном виде следующим образом.
Листинг 4.3. Упрощённая запись преобразования<result
xsl:version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Шаблон -->
</result >
Приведем еще один простой пример упрощенной записи преобразования, генерирующего простейшую HTML-страницу.
Листинг 4.4. Упрощённая запись преобразования XML-документа в HTML<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<head>
<title>
<xsl:value-of select="page/name"/>
</title>
</head>
<body>
<xsl:value-of select="page/content"/>
</body>
</html>
Следующий листинг приводит полную версию этого же преобразования.
Листинг 4.5. Полная запись преобразования XML-документа в HTML<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<head>
<title>
<xsl:value-of select="page/name"/>
</title>
</head>
<body>
<xsl:value-of select="page/content"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Модульная организация преобразования
Как и любой, достаточно развитый язык программирования, XSLT обладает средствами для организации модульной структуры преобразований. Существуют два основных способа использования в преобразованиях внешних модулей — включение и импорт. Кроме того, поскольку преобразования в XSLT также являются XML-документами, для разбиения их на модули можно применять сущности.
Включение преобразований
Подобно тому, как мы бы использовали в языке С директиву #include для включения внешних файлов, преобразования в XSLT могут использовать для той же самой цели элемент xsl:include. Правда, в отличие от языка С, условное включение в XSLT невозможно.
Элемент xsl:include
<xsl:include
href = "URI"/>
Обязательный атрибут href элемента xsl:include содержит URI внешнего модуля, который должен быть включен в текущее преобразование. Внешний модуль обязан быть корректным XSLT-преобразованием.
Включение внешнего преобразования является включением в прямом смысле этого слова: преобразование, включающее внешний модуль, ведет себя так, как если бы на месте элемента xsl:include было содержимое этого внешнего модуля.
ПримерРассмотрим простое преобразование a.xsl, которое определяет значение переменной date.
Листинг 4.6. Преобразование a.xsl<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="date" select="'16.07.2001'"/>
</xsl:stylesheet>
Включим a.xsl в преобразование b.xsl.
Листинг 4.7. Преобразование b.xsl<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="a.xsl"/>
<xsl:template match="/">