Выбрать главу

 <xsclass="underline" include href="a.xsl"/>

 <xsclass="underline" template match="/">

  <content>

   <xsclass="underline" text>Today is </xsclass="underline" text>

   <xsclass="underline" value-of select="$date"/>

   <xsclass="underline" text>.</xsclass="underline" text>

  </content>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

<xsclass="underline" stylesheet

 version="1.0"

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

 <xsclass="underline" variable name="date" select="'16.07.2001'"/>

 <xsclass="underline" template match="/">

  <content>

   <xsclass="underline" text>Today is </xsclass="underline" text>

   <xsclass="underline" value-of select="$date"/>

   <xsclass="underline" text>.</xsclass="underline" text>

  </content>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

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

Пример

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

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

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

<xsclass="underline" include href="b.xsl"/>

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

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

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

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

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

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

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

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

Пример

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

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

<xsclass="underline" stylesheet

 version="1.0"

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

 <xsclass="underline" import href="a.xsl"/>

 <xsclass="underline" variable name="a"/>

 <xsclass="underline" include href="b.xsl"/>

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

</xsclass="underline" stylesheet>

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

<xsclass="underline" stylesheet

 version="1.0"

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

 <xsclass="underline" import href="c.xsl"/>

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

</xsclass="underline" stylesheet>

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

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

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

 <xsclass="underline" import href=f"c.xsl"/>

 <xsclass="underline" variable name="a"/>

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

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

</xsclass="underline" stylesheet>

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

Пример

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

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

<html xsclass="underline" version="1.0"

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

 <xsclass="underline" apply-templates/>

</html>

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

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

<xsclass="underline" stylesheet

 version="1.0"

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

 <xsclass="underline" include href="simple.xsl"/>

 <xsclass="underline" template match="a">

  <xsclass="underline" value-of select="."/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

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

<xsclass="underline" stylesheet

 version="1.0"

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

 <xsclass="underline" template match="/">

  <html>

   <xsclass="underline" apply-templates/>

  </html>

 </xsclass="underline" template>

 <xsclass="underline" template match="a">

  <xsclass="underline" value-of select="."/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

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

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

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