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 для модульной организации данных. Части преобразований можно просто вынести во внешние документы и включать в документ в виде сущности.

Пример Листинг 4.15. Входящий документ:

<root>

 <a/>

 <b/>

</root>

Листинг 4.16. Основное преобразование

<!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>

Листинг 4.17. Файл ab.xsl

<xsl:template match='a'>

 <A/>

</xsl:template>

<xsl:template match='b'>

 <B/>

</xsl:template>

Листинг 4.18. Результат преобразования

<ROOT>

 <A/>

 <B/>

</ROOT>

В этом примере в DTD-блоке мы определяем сущность с именем ab, которая содержит два шаблонных правила для обработки элементов a и b. Файл ab.xsl, в котором содержится текст внешней сущности, заменяет в документе ссылку &ab;. После раскрытия процессором сущности (замены ссылки на ее содержимое) наше преобразование будет выглядеть следующим образом.

Листинг 4.19. Основное преобразование после раскрытия сущности &ab;

<xsl:stylesheet

 version='1.0'

 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

 <xsl:template match='root'>

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату