Подобно тому, как мы бы использовали в языке С директиву
#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="#"/>
<xsl:template match="/">
<content>
<xsl:text>Today is </xsl:text>
<xsl:value-of select="$date"/>
<xsl:text>.</xsl:text>
</content>
</xsl:template>
</xsl:stylesheet>
Включение в преобразование
b.xsl
преобразования
a.xsl
эквивалентно замене в
b.xsl
соответствующего элемента
xsl:include
на содержимое преобразования
a.xsl
. В нашем случае будет включено только определение переменной
date
. Преобразование
b.xsl
можно переписать в следующем виде: .
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="date" select="'16.07.2001'"/>
<xsl:template match="/">
<content>
<xsl:text>Today is </xsl:text>
<xsl:value-of select="$date"/>
<xsl:text>.</xsl:text>
</content>
</xsl:template>
</xsl:stylesheet>
При включении внешних преобразований при помощи
xsl:include
следует учитывать некоторые особенности
использования этого элемента.
Все ссылки и относительные идентификаторы ресурсов (URI), используемые во включаемом преобразовании, вычисляются относительно его базового адреса.
Пример
Предположим, что URI нашего преобразования имеет вид:
http://www.xsltdev.ru/examples/a.xsl
В этом случае элемент
<xsl:include href="#"/>
будет включать преобразование с URI
http://www.xsltdev.ru/examples/b.xsl
Нет никаких проблем и с включением преобразований по абсолютным идентификаторам. Например, если преобразование
identity.xsl
находится по адресу
http://www.xsltdev.ru/stylesheets/identity.xsl
то включить его можно элементом
<xsl:include href="#"/>
Естественно, включаемые модули должны быть доступны процессору во время выполнения преобразования, поэтому если они находятся на других серверах, то всегда будет существовать возможность невыполнения преобразования.
В XSLT элементы
xsl:import
всегда должны быть первыми дочерними элементами головного элемента
xsl:stylesheet
. Поэтому элементы
xsl:import
внешнего преобразования включаются сразу после элементов
xsl:import
основного преобразования. Если в основном преобразовании элементов
xsl:import
нет, то включаемые элементы
xsl:import
становятся первыми дочерними элементами
xsl:stylesheet
основного преобразования.
Пример
Предположим, что в основное преобразование мы импортируем файл
a.xsl
и включаем файл
b.xsl
.
Листинг 4.8. Основное преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="#"/>
<xsl:variable name="a"/>
<xsl:include href="#"/>
<!-- Содержимое основного преобразования -->
</xsl:stylesheet>
Листинг 4.9. Преобразование b.xsl
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="#"/>
<!-- Содержимое преобразования b.xsl -->
</xsl:stylesheet>
Тогда основное преобразование может быть переписано следующим образом.
Листинг 4.10. Основное преобразование после включения b.xsl