xsl:include¶
Включение внешнего преобразования является включением в прямом смысле этого слова: преобразование, включающее внешний модуль, ведет себя так, как если бы на месте элемента xsl:include было содержимое этого внешнего модуля.
Синтаксис¶
1 | |
Атрибуты:
href- обязательный атрибут, содержит URI внешнего модуля, который должен быть включен в текущее преобразование. Внешний модуль обязан быть корректным XSLT-преобразованием.
Описание и примеры¶
Пример 1¶
Рассмотрим простое преобразование a.xsl, которое определяет значение переменной date.
Листинг 4.6. Преобразование a.xsl
1 2 3 4 5 6 | |
Включим a.xsl в преобразование b.xsl.
Листинг 4.7. Преобразование b.xsl
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Включение в преобразование b.xsl преобразования a.xsl эквивалентно замене в b.xsl соответствующего элемента xsl:include на содержимое преобразования a.xsl. В нашем случае будет включено только определение переменной date. Преобразование b.xsl можно переписать в следующем виде:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
При включении внешних преобразований при помощи xsl:include следует учитывать некоторые особенности использования этого элемента.
Все ссылки и относительные идентификаторы ресурсов (URI), используемые во включаемом преобразовании, вычисляются относительно его базового адреса.
Пример 2¶
Предположим, что URI нашего преобразования имеет вид:
1 | |
В этом случае элемент
1 | |
будет включать преобразование с URI
1 | |
Нет никаких проблем и с включением преобразований по абсолютным идентификаторам. Например, если преобразование identity.xsl находится по адресу
1 | |
то включить его можно элементом
1 2 3 | |
Естественно, включаемые модули должны быть доступны процессору во время выполнения преобразования, поэтому если они находятся на других серверах, то всегда будет существовать возможность невыполнения преобразования.
В XSLT элементы xsl:import всегда должны быть первыми дочерними элементами головного элемента xsl:stylesheet. Поэтому элементы xsl:import внешнего преобразования включаются сразу после элементов xsl:import основного преобразования. Если в основном преобразовании элементов xsl:import нет, то включаемые элементы xsl:import становятся первыми дочерними элементами xsl:stylesheet основного преобразования.
Пример 3¶
Предположим, что в основное преобразование мы импортируем файл a.xsl и включаем файл b.xsl.
Листинг 4.8. Основное преобразование
1 2 3 4 5 6 7 8 9 | |
Листинг 4.9. Преобразование b.xsl
1 2 3 4 5 6 7 | |
Тогда основное преобразование может быть переписано следующим образом.
Листинг 4.10. Основное преобразование после включения b.xsl
1 2 3 4 5 6 7 8 9 10 | |
Элемент xsl:include можно использовать и для включения преобразований с упрощенным синтаксисом. Преобразования такого рода будут включаться как эквивалентные им преобразования стандартного синтаксиса — то есть с корневым элементом xsl:stylesheet и единственным шаблоном, соответствующим корневому узлу.
Пример 4¶
Предположим, что мы используем преобразование упрощенного синтаксиса simple.xsl.
Листинг 4.11. Преобразование simple.xsl
1 2 3 4 5 6 | |
Включим simple.xsl в основное преобразование.
Листинг 4.12. Основное преобразование
1 2 3 4 5 6 7 8 9 | |
Тогда основное преобразование может быть переписано в следующем виде.
Листинг 4.13. Основное преобразование после включения simple.xsl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Комментарием на листинге 4.13 выделен шаблон, который соответствует преобразованию simple.xsl.
Следует отметить, что разные процессоры по-разному обрабатывают включение упрощенных преобразований. К сожалению, большинство из них не поддерживают эту особенность, хотя она четко определена в спецификации, поэтому, если требуется высокая надежность и переносимость, таких включений лучше избегать.
Включаемые модули являются полноценными и самостоятельными преобразованиями. К примеру, они также могут включать другие преобразования при помощи тех же элементов xsl:include. При этом преобразование не должно прямо или косвенно включать само себя — такая ситуация породит бесконечный цикл включений.
См. также¶
xsl:import— импорт преобразований.
Ссылки¶
xsl:includeMDN (рус.)xsl:includeMSDN (en)