Другим способом использования внешних модулей в XSLT является импорт преобразований, который обеспечивается элементом xsl:import
. Импорт преобразований более сложен, чем их простое включение — последовательность импорта модулей может влиять на то, как будет выполняться преобразование. Равно как и в случае с xsl:include
, условное импортирование преобразований не разрешено.
Элемент
<xsl:import
href ='
Синтаксис импорта преобразования практически полностью аналогичен включению: обязательный атрибут href
содержит URI внешнего модуля, который должен быть импортирован в текущее преобразование. Так же, как и в случае с xsl:include
, элемент xsl:import
логически заменяется содержимым внешнего модуля, и относительные идентификаторы ресурсов (URI), используемые во внешнем преобразовании, отсчитываются от его базового адреса. Преобразование не может прямо или косвенно импортировать само себя.
Не следует импортировать или включать в преобразование больше кода, чем необходимо. Если в одном импортируемом модуле находится много разнородных шаблонов, определений и так далее, лучше разбить этот модуль на несколько более мелких. Половина модуля загружается быстрее, чем модуль целиком. При этом целый модуль загружается быстрее, чем две его половины по отдельности.
Главным отличием импорта преобразований является то, что последовательность импортирования внешних модулей, называемая
Порядок импорта
Как уже было сказано выше, элементы xsl:import
должны всегда быть первыми дочерними элементами xsl:stylesheet
. Порядок, в котором они находятся в преобразовании, определяет порядок импорта внешних модулей следующим образом.
□ Порядок импорта основного преобразования всегда старше порядка импорта внешнего преобразования.
□ В случае, если преобразование импортирует несколько внешних модулей, порядок импорта преобразований, которые импортируются раньше, младше порядка импорта последующих модулей.
□ Порядок импорта преобразования, включенного в основное при помощи элемента xsl:include
, равен порядку импорта основного преобразования.
Эти правила могут быть проиллюстрированы следующими примерами.
Рассмотрим преобразование alpha.xsl
, которое импортирует преобразования bravo.xsl
и сharlie.xsl
и включает преобразование delta.xsl
.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:import href='bravo.xsl'/>
<xsl:import href='charlie.xsl'/>
<xsl:import href='delta.xsl'/>
<!-- ... -->
</xsl:stylesheet>
В соответствии с первым правилом, порядок импорта основного преобразования старше порядка импорта внешних модулей, значит alpha.xsl
старше bravo.xsl
и charlie.xsl
. Далее, согласно второму правилу порядок импорта преобразования bravo.xsl
младше порядка charlie.xsl
, поскольку оно импортируется первым. Преобразование delta.xsl
будет иметь порядок импорта такой же, как и у основного преобразования alpha.xsl
. Таким образом, порядок импорта в этом примере будет иметь следующий вид:
bravo.xsl
charlie.xsl
alpha.xsl delta.xsl
Преобразование bravo.xsl
будет самым младшим, а преобразования alpha.xsl
и delta.xsl
— самыми старшими.
Заметим, что импортируемые преобразования могут и сами импортировать другие модули. В этих случаях вычисление порядка импорта несколько усложняется.
Техническая рекомендация XSLT предлагает решать эту проблему построением логического дерева импорта.
Рассмотрим следующую схему включений и импорта (табл 4.1).
Преобразование | Импортирует | Включает |
---|---|---|
alpha.xsl | bravo.xsl charlie.xsl | |
bravo.xsl | delta.xsl echo.xsl | foxtrot.xsl |
charlie.xsl | golf.xsl hotel.xsl | |