hotel.xsl | india.xsl |
Этой схеме будет соответствовать логическое дерево импорта на рис. 4.1.
Рис. 4.1. Обход дерева импорта преобразований
В соответствии с правилами, левые ветки дерева будут младше правых, вершины, находящиеся ближе к корню, будут старше тех, которые дальше от него, включенные преобразования имеют тот же приоритет, что и у родителей.
Таким образом, порядок импорта преобразований от младших к старшим будет выглядеть следующим образом:
delta.xsl
echo.xsl
bravo.xsl foxtrot.xsl
golf.xsl
hotel.xsl india.xsl
charlie.xsl
alpha.xsl
Порядок, в котором импортируются модули, непосредственным образом влияет на различные аспекты преобразования. Эффект, который оказывает порядок импорта на те или иные элементы, будет подробно описан при их рассмотрении — сейчас же мы их просто коротко перечислим.
□ xsl:attribute-set
— порядок импорта используется для определения главенства элементов xsl:attribute
, включенных в разные именованные списки атрибутов, но создающих атрибуты с одинаковыми именами.
□ xsl:namespace-alias
— в случае, если в преобразовании определяются несколько псевдонимов префиксов пространств имен, процессор использует самый старший в порядке импорта псевдоним.
□ xsl:output
— эти элементы объединяются процессором. В случае конфликтов, например, когда в разных элементах xsl:output
атрибуты определены по- разному, процессор должен использовать старшее в порядке импорта определение.
□ xsl:strip-space
и xsl:preserve-space
— в этих элементах порядок импорта также используется для разрешения конфликтов: выигрывают определения со старшим порядком импорта.
□ xsl:template
— порядок импорта используется для разрешения конфликтов, которые возникают в случаях, когда один узел может быть обработан несколькими шаблонами. Шаблон, содержащийся в преобразовании с младшим порядком импорта, будет просто исключен из рассмотрения.
□ xsl:variable
и xsl:param
— порядок импорта используется при обращении к глобальным переменным в случае, если в разных преобразованиях существуют разные определения переменной с одним именем. В подобной ситуации будет использована переменная со старшим порядком импорта.
Использование сущностей для разбивки на модули
Поскольку XSLT-преобразования являются XML-документами, мы можем воспользоваться средствами XML для модульной организации данных. Части преобразований можно просто вынести во внешние документы и включать в документ в виде сущности.
<root>
<a/>
<b/>
</root>
<!DOCTYPE xsl:stylesheet [
<!ENTITY ab SYSTEM 'ab.xsl'>
]>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='root'>
<ROOT>
<xsl:apply-templates/>
</ROOT>
</xsl:template>
&ab;
</xsl:stylesheet>
<xsl:template match='a'>
<A/>
</xsl:template>
<xsl:template match='b'>
<B/>
</xsl:template>
<ROOT>
<A/>
<B/>
</ROOT>
В этом примере в DTD-блоке мы определяем сущность с именем ab
, которая содержит два шаблонных правила для обработки элементов a
и b
. Файл ab.xsl
, в котором содержится текст внешней сущности, заменяет в документе ссылку &ab;
. После раскрытия процессором сущности (замены ссылки на ее содержимое) наше преобразование будет выглядеть следующим образом.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='root'>