Использование сущностей для разбивки на модули
Поскольку XSLT-преобразования являются XML-документами, мы можем воспользоваться средствами XML для модульной организации данных. Части преобразований можно просто вынести во внешние документы и включать в документ в виде сущности.
<root>
<a/>
<b/>
</root>
<!DOCTYPE xsclass="underline" stylesheet [
<!ENTITY ab SYSTEM "ab.xsl">
]>
<xsclass="underline" stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="root">
<ROOT>
<xsclass="underline" apply-templates/>
</ROOT>
</xsclass="underline" template>
&ab;
</xsclass="underline" stylesheet>
<xsclass="underline" template match="a">
<A/>
</xsclass="underline" template>
<xsclass="underline" template match="b">
<B/>
</xsclass="underline" template>
<ROOT>
<A/>
<B/>
</ROOT>
В этом примере в DTD-блоке мы определяем сущность с именем ab, которая содержит два шаблонных правила для обработки элементов a и b. Файл ab.xsl, в котором содержится текст внешней сущности, заменяет в документе ссылку &ab;. После раскрытия процессором сущности (замены ссылки на ее содержимое) наше преобразование будет выглядеть следующим образом.
<xsclass="underline" stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="root">
<ROOT>
<xsclass="underline" apply-templates/>
</ROOT>
</xsclass="underline" template>
<xsclass="underline" template match="a">
<A/>
</xsclass="underline" template>
<xsclass="underline" template match="b">
<B/>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Совместное использование преобразований и XML-документов
Ассоциация преобразования с XML-документом
Тем, кому приходилось работать со стилями в HTML-документах, пожалуй будет знакома конструкция вида <LINK REL="stylesheet">, которая закрепляет за документом определенный стиль. Включив такую конструкцию, автор явным образом указывает, как следует отображать данный документ.
Подобные задачи возникают и при работе с XSLT. Например, если для обработки XML-документа всегда будет использоваться одно и то же преобразование, логично будет закрепить это преобразование за документом.
Для того чтобы закрепить XSLT-преобразование за XML-документом, в последнем должна быть использована инструкция по обработке xml-stylesheet, которая имеет следующий вид:
<?xml-stylesheet
href="URI"
type="тип"
title="название"
media="тип носителя"
charset="кодировка"
alternate="yes" | "no"?>
Заметим, что xml-stylesheet может закреплять за XML-документами не только преобразования. Основным назначением инструкции xml-stylesheet является ассоциация с документом фиксированного стиля (англ. stylesheet — стиль, стилевая таблица). С этой точки зрения преобразования являются не более, чем частным случаем стилевых таблиц.
Инструкция xml-stylesheet содержит шесть псевдоатрибутов (приставка псевдо- поясняет, что на самом деле инструкции по обработке не имеют атрибутов), два из которых, href и type, являются обязательными. Использование псевдоатрибутов xml-stylesheet поясняет табл. 4.2.
Таблица 4.2. Псевдоатрибуты инструкции по обработке xml-stylesheet
| Псевдоатрибут | Описание |
|---|---|
href |
Указывает местоположение стиля, закрепляемого за документом. В случае преобразований, href указывает местоположение преобразования, которое нужно применять к этому документу. В псевдоатрибуте href может быть также указан уникальный идентификатор преобразования, если оно включено в сам документ (см. раздел "Включение преобразования в документ"). |
type |
Указывает тип стиля, закрепляемого за документом. В нашем случае, поскольку мы ассоциируем с документом XSLT-преобразование, псевдоатрибут type должен иметь значение "text/xsl" |
title |
Задает название закрепляемого стиля. Название не имеет особого значения при обработке — оно просто поясняет назначение стиля |
media |
Указывает тип носителя или устройства, для которого предназначен результирующий документ |
charset |
Определяет кодировку, в которой создан стиль. Если стиль является XSLT-преобразованием, значение псевдоатрибута charset в расчет не принимается, поскольку кодировка преобразований явно или неявно определена в них самих |
alternate |
Указывает, является ли данный стиль основным ("no") или альтернативным ("yes"). Значением этого атрибута по умолчанию является "no" |
Что касается псевдоатрибута type, то на самом деле нет стандарта, который заставлял бы использовать значение "text/xsl". Рабочая группа XSL Консорциума W3 до сих пор обсуждает, какой именно тип должен быть присвоен XSLT. Поскольку XSLT есть XML-язык, формально следовало бы использовать "application/xml", однако с легкой подачи Microsoft все используют "text/xsl".
Инструкция xml-stylesheet может быть включена только в пролог документа, то есть она должна предшествовать корневому элементу. Не рекомендуется включать эту инструкцию в блоки DOCTYPE, поскольку некоторые парсеры и процессоры будут ее в этом случае игнорировать.