XSL позволяет комбинировать стили и тем самым создавать модульную структуру преобразований. Существует два механизма использования внешних стилей: включение и импорт. Включение осуществляется с помощью элемента верхнего уровня xsl:include, а импорт с помощью элемента верхнего уровня xsl:import.
Синтаксис:
1 2 | <xsl:include href = "URI" /> |
и
1 2 | <xsl:import href = "URI" /> |
Атрибуты:
href
— обязательный атрибут, содержит путь до файла с включаемым или импортируемым стилем
Элемент xsl:import
должен быть всегда первым дочерним элементом xsl:stylesheet
. На xsl:include
таких ограничений не накладывается. Импортируемые и включаемые стили могут содержать другие импортируемые или включаемые стили, все они будут использованы в преобразовании. При этом стиль не должен прямо или косвенно включать или импортировать сам себя.
Импортируемые и включаемые стили могут содержать одинаковые шаблоны, переменные и прочие конфликтующие инструкции. Разрешаются эти конфликты в соответствии с приоритетом (порядком) импорта. Все шаблоны, переменные и инструкции имеют такой же приоритет импорта как и стиль, в котором они находятся. Применяться в преобразовании будет тот стиль (шаблон, переменная, инструкция), который обладает высшим приоритетом импорта по отношению к конфликтующему с ним. Приоритет импорта стиля определяется по следующим правилам:
- приоритет импорта основного стиля (тот, который импортирует остальные) всегда выше приоритета импортируемых;
- приоритет импорта включенного стиля (
xsl:include
) равен приоритету импорта основного стиля; - если основной стиль импортирует несколько внешних стилей, то приоритет импорта этих внешних стилей будет возрастать от первого (который импортируется раньше/выше) к последнему (который импортируется позже/ниже);
- если импортируемые (внешние) стили в свою очередь импортируют другие стили, то приоритет этих дочерних стилей будет выше, чем у импортированных в основной стиль раньше родительского и ниже, чем у импортированных в основной стиль позже родительского.
Чтоб все это стало понятнее приведу пример:
main.xsl
1 2 3 4 5 | <xsl:stylesheet> <xsl:import href="styleA.xsl" /> <xsl:import href="styleB.xsl" /> <xsl:include href="styleC.xsl" /> </xsl:stylesheet> |
styleA.xsl
1 2 3 4 5 | <xsl:stylesheet> <xsl:import href="styleA-a.xsl" /> <xsl:import href="styleA-b.xsl" /> <xsl:include href="styleA-c.xsl" /> </xsl:stylesheet> |
styleB.xsl
1 2 3 4 5 | <xsl:stylesheet> <xsl:import href="styleB-a.xsl" /> <xsl:import href="styleB-b.xsl" /> <xsl:include href="styleB-c.xsl" /> </xsl:stylesheet> |
styleC.xsl
1 2 3 4 5 | <xsl:stylesheet> <xsl:import href="styleC-a.xsl" /> <xsl:import href="styleC-b.xsl" /> <xsl:include href="styleC-c.xsl" /> </xsl:stylesheet> |
Приоритет импорта в этом случае будет следующий (от большего к меньшему):
- main.xsl, styleC.xsl и styleC-c.xsl
- styleC-b.xsl
- styleC-a.xsl
- styleB.xsl и styleB-c.xsl
- styleB-b.xsl
- styleB-a.xsl
- styleA.xsl и styleA-c.xsl
- styleA-b.xsl
- styleA-a.xsl