xsl:text>
Применив это преобразование, например, к главной странице Консорциума W3 (http://www.w3.org), мы получим ее точный дубликат, в конце которого будет приведен перечень всех найденных текстовых ссылок. Выходящий документ будет заканчиваться фрагментом вида:
Links found on this page:
About W3C
Accessibility
Activities
и так далее.
Заметим, что того же эффекта можно было добиться другими способами, например, при помощи именованных шаблонов или элемента
xsl:for-each
, однако применение режимов, пожалуй, является наиболее гибкой техникой.Досадным ограничением режимов является то, что режим нельзя выбирать динамически. Атрибут
mode
обязан иметь фиксированное значение, то есть вызов вида:
будет некорректным. Особо серьезных практических противопоказаний для динамических режимов нет, будем надеяться, что в следующих версиях XSLT они появятся.
Именованные шаблоны
Вместо того чтобы при помощи атрибута
match
указывать, какая часть входящего документа должна преобразовываться данным шаблоном, ему можно присвоить имя и вызывать в любой момент вне зависимости от контекста преобразования. Такие шаблоны очень схожи по принципу с процедурами в императивных языках программирования — они позволяют выносить часто используемые части преобразований, передавать им параметры и вызывать вне зависимости от того, что именно обрабатывается в данный момент.Имя шаблонному правилу присваивается атрибутом name элемента
xsl:template
. После этого шаблону более необязательно иметь атрибут match
, теперь он может быть вызван просто по имени. Два шаблона с одним порядком импорта не могут иметь одинаковых имен. Если же одинаковые имена имеют шаблоны различного порядка импорта, шаблоны старшего порядка переопределяют младшие шаблоныПримерПри генерации HTML-страниц часто встречающейся задачей является создание элемента
head
. Элемент head
, как правило, содержит несколько элементов meta
, предоставляющих метаинформацию, элемент title
, который определяет название страницы и элемент link
, который связывает данную страницу с другими документами, например, с каскадными таблицами стилей (CSS).Для того чтобы упростить процедуру генерации
head
, мы можем вынести ее в отдельный именованный шаблон.Листинг 5.5. Именованный шаблон для генерации элемента head
content="This site is dedicated to XSLT and Xpath."/>
XSLTdev.ru - XSLT developer resource
Думается, этот шаблон не требует пояснений — он просто создает в входящем документе несколько элементов. Непонятным пока остается другое — как вызывать именованные шаблоны? Элемент
xsl:apply-templates
явно не подходит, поскольку именованные шаблоны не обязаны иметь атрибут match
. Их выполнение производится элементом xsl:call-template
.Элемент xsl:call-template
Приведем синтаксис этого элемента:
name="имя">
Обязательный атрибут name указывает имя шаблона, который вызывается этой инструкцией. Например, шаблон с именем "
head
", приведенный выше, может быть вызван следующим образом:
Атрибут
name
при вызове обязан иметь фиксированное значение — точно так же, как и в случае с mode
и xsl:apply-templates
, динамика здесь не разрешена.При вызове
xsl:call-template
не изменяет контекста преобразования. Фактически, вызов именованного шаблона эквивалентен замене в тексте преобразования элемента xsl:call-template
на тело вызываемого шаблона.Приведем пример.
Листинг 5.6. Входящий документ
Just a few words...
Листинг 5.7. Преобразование
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
content="This site is dedicated to XSLT and Xpath."/>
XSLTdev.ru - XSLT developer resource
Листинг 5.8. Выходящий документ
content="This site is dedicated to XSLT and Xpath.">
XSLTdev.ru - XSLT developer resource
Just a few words...
ПримечаниеНесколько более эффективным способом использования в документе статических частей (как содержимое элемента
head
в приведенном примере) является хранение этих частей во внешних документах и вставка их в выходящий документ при помощи элемента xsl:copy-of
и функции document
.В этом примере шаблон, обрабатывающий корневой элемент, фактически эквивалентен шаблону вида:
content="This site is dedicated to XSLT and Xpath."/>
XSLTdev.ru - XSLT developer resource
В принципе именованные шаблоны не обязаны иметь атрибут
match
, но он все же может быть определен. В этом случае шаблон можно будет применять как для обработки частей документов элементом xsl:apply-templates
, так и вызывая его по имени элементом xsl:call-template
.ПримерИзменим объявление нашего шаблона head следующим образом:
...
Теперь, если входящий документ будет иметь вид
Just a few words...
то результат выполнения следующих двух шаблонов будет одинаков.
Листинг 5.9. Шаблон для page — версия 1
Предыдущая
Стр. 19 из 66
Следующая