KnigaRead.com/

Алексей Валиков - Технология XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Алексей Валиков, "Технология XSLT" бесплатно, без регистрации.
Перейти на страницу:

 <xsl:include href="a.xsl"/>

 <xsl:template match="/">

  <content>

   <xsl:text>Today is </xsl:text>

   <xsl:value-of select="$date"/>

   <xsl:text>.</xsl:text>

  </content>

 </xsl:template>

</xsl:stylesheet>

Включение в преобразование b.xsl преобразования a.xsl эквивалентно замене в b.xsl соответствующего элемента xsl:include на содержимое преобразования a.xsl. В нашем случае будет включено только определение переменной date. Преобразование b.xsl можно переписать в следующем виде: .

<xsl:stylesheet

 version="1.0"

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

 <xsl:variable name="date" select="'16.07.2001'"/>

 <xsl:template match="/">

  <content>

   <xsl:text>Today is </xsl:text>

   <xsl:value-of select="$date"/>

   <xsl:text>.</xsl:text>

  </content>

 </xsl:template>

</xsl:stylesheet>

При включении внешних преобразований при помощи xsl:include следует учитывать некоторые особенности использования этого элемента.

Все ссылки и относительные идентификаторы ресурсов (URI), используемые во включаемом преобразовании, вычисляются относительно его базового адреса.

Пример

Предположим, что URI нашего преобразования имеет вид:

http://www.xsltdev.ru/examples/a.xsl

В этом случае элемент

<xsl:include href="b.xsl"/>

будет включать преобразование с URI

http://www.xsltdev.ru/examples/b.xsl

Нет никаких проблем и с включением преобразований по абсолютным идентификаторам. Например, если преобразование identity.xsl находится по адресу

http://www.xsltdev.ru/stylesheets/identity.xsl

то включить его можно элементом

<xsl:include href=" http://www.xsltdev.ru/stylesheets/identity.xsl"/>

Естественно, включаемые модули должны быть доступны процессору во время выполнения преобразования, поэтому если они находятся на других серверах, то всегда будет существовать возможность невыполнения преобразования.

В XSLT элементы xsl:import всегда должны быть первыми дочерними элементами головного элемента xsl:stylesheet. Поэтому элементы xsl:import внешнего преобразования включаются сразу после элементов xsl:import основного преобразования. Если в основном преобразовании элементов xsl:import нет, то включаемые элементы xsl:import становятся первыми дочерними элементами xsl:stylesheet основного преобразования.

Пример

Предположим, что в основное преобразование мы импортируем файл a.xsl и включаем файл b.xsl.

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

<xsl:stylesheet

 version="1.0"

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

 <xsl:import href="a.xsl"/>

 <xsl:variable name="a"/>

 <xsl:include href="b.xsl"/>

 <!-- Содержимое основного преобразования -->

</xsl:stylesheet>

Листинг 4.9. Преобразование b.xsl

<xsl:stylesheet

 version="1.0"

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

 <xsl:import href="c.xsl"/>

 <!-- Содержимое преобразования b.xsl -->

</xsl:stylesheet>

Тогда основное преобразование может быть переписано следующим образом.

Листинг 4.10. Основное преобразование после включения b.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:import href="a.xsl"/>

 <xsl: import href=f"c.xsl"/>

 <xsl:variable name="a"/>

 <!-- Содержимое преобразования b.xsl -->

 <!-- Содержимое основного преобразования -->

</xsl:stylesheet>

Элемент xsl:include можно использовать и для включения преобразований с упрощенным синтаксисом. Преобразования такого рода будут включаться как эквивалентные им преобразования стандартного синтаксиса — то есть с корневым элементом xsl:stylesheet и единственным шаблоном, соответствующим корневому узлу.

Пример

Предположим, что мы используем преобразование упрощенного синтаксиса simple.xsl.

Листинг 4.11. Преобразование simple.xsl

<html xsl:version="1.0"

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

 <xsl:apply-templates/>

</html>

Включим simple.xsl в основное преобразование.

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

<xsl:stylesheet

 version="1.0"

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


 <xsl:include href="simple.xsl"/>


 <xsl:template match="a">

  <xsl:value-of select="."/>

 </xsl:template>

</xsl:stylesheet>

Тогда основное преобразование может быть переписано в следующем виде.

Листинг 4.13. Основное преобразование после включения simple.xsl

<xsl:stylesheet

 version="1.0"

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


 <xsl:template match="/">

  <html>

   <xsl:apply-templates/>

  </html>

 </xsl:template>


 <xsl:template match="a">

  <xsl:value-of select="."/>

 </xsl:template>

</xsl:stylesheet>

Полужирным шрифтом на листинге 4.13 выделен шаблон, который соответствует преобразованию simple.xsl.

Следует отметить, что разные процессоры по-разному обрабатывают включение упрощенных преобразований. К сожалению, большинство из них не поддерживают эту особенность, хотя она четко определена в спецификации, поэтому, если требуется высокая надежность и переносимость, таких включений лучше избегать.

Включаемые модули являются полноценными и самостоятельными преобразованиями. К примеру, они также могут включать другие преобразования при помощи тех же элементов xsl:include. При этом преобразование не должно прямо или косвенно включать само себя — такая ситуация породит бесконечный цикл включений.

Импорт преобразований

Другим способом использования внешних модулей в XSLT является импорт преобразований, который обеспечивается элементом xsl:import. Импорт преобразований более сложен, чем их простое включение — последовательность импорта модулей может влиять на то, как будет выполняться преобразование. Равно как и в случае с xsl:include, условное импортирование преобразований не разрешено.

Элемент xsl:import

<xsl:import

 href =" URI"/>

Синтаксис импорта преобразования практически полностью аналогичен включению: обязательный атрибут href содержит URI внешнего модуля, который должен быть импортирован в текущее преобразование. Так же, как и в случае с xsl:include, элемент xsl:import логически заменяется содержимым внешнего модуля, и относительные идентификаторы ресурсов (URI), используемые во внешнем преобразовании, отсчитываются от его базового адреса. Преобразование не может прямо или косвенно импортировать само себя.

Совет

Не следует импортировать или включать в преобразование больше кода, чем необходимо. Если в одном импортируемом модуле находится много разнородных шаблонов, определений и так далее, лучше разбить этот модуль на несколько более мелких. Половина модуля загружается быстрее, чем модуль целиком. При этом целый модуль загружается быстрее, чем две его половины по отдельности.

Главным отличием импорта преобразований является то, что последовательность импортирования внешних модулей, называемая порядком импорта оказывает влияние на приоритет исполнения шаблонов, определения и многое другое.

Порядок импорта

Как уже было сказано выше, элементы xsl:import должны всегда быть первыми дочерними элементами xsl:stylesheet. Порядок, в котором они находятся в преобразовании, определяет порядок импорта внешних модулей следующим образом.

□ Порядок импорта основного преобразования всегда старше порядка импорта внешнего преобразования.

□ В случае, если преобразование импортирует несколько внешних модулей, порядок импорта преобразований, которые импортируются раньше, младше порядка импорта последующих модулей.

□ Порядок импорта преобразования, включенного в основное при помощи элемента xsl:include, равен порядку импорта основного преобразования.

Эти правила могут быть проиллюстрированы следующими примерами.

Рассмотрим преобразование alpha.xsl, которое импортирует преобразования bravo.xsl и сharlie.xsl и включает преобразование delta.xsl.

Листинг 4.14. Фрагмент преобразования alpha.xsl

<xsl:stylesheet

 version="1.0"

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*