переопределяют младшие шаблоны

Пример

При генерации HTML-страниц часто встречающейся задачей является создание элемента head. Элемент head, как правило, содержит несколько элементов meta, предоставляющих метаинформацию, элемент title, который определяет название страницы и элемент link, который связывает данную страницу с другими документами, например, с каскадными таблицами стилей (CSS).

Для того чтобы упростить процедуру генерации head, мы можем вынести ее в отдельный именованный шаблон.

Листинг 5.5. Именованный шаблон для генерации элемента head

<xsl:template name='head'>

 <head>

  <meta name='keywords' content='XSLT, XPath, XML'/>

  <meta name='description'

   content='This site is dedicated to XSLT and Xpath.'/>

  <title>XSLTdev.ru - XSLT developer resource</title>

  <link rel='stylesheet' type='text/css' href='style/main.css'/>

 </head>

</xsl:template>

Думается, этот шаблон не требует пояснений — он просто создает в входящем документе несколько элементов. Непонятным пока остается другое — как вызывать именованные шаблоны? Элемент xsl:apply-templates явно не подходит, поскольку именованные шаблоны не обязаны иметь атрибут match. Их выполнение производится элементом xsl:call-template.

Элемент xsl:call-template

Приведем синтаксис этого элемента:

<xsl:call-template

 name='имя'>

 <!-- Содержимое: несколько элементов xsl:with-param -->

</xsl:call-template>

Обязательный атрибут name указывает имя шаблона, который вызывается этой инструкцией. Например, шаблон с именем 'head', приведенный выше, может быть вызван следующим образом:

<xsl:call-template name='head'/>

Атрибут name при вызове обязан иметь фиксированное значение — точно так же, как и в случае с mode и xsl:apply-templates, динамика здесь не разрешена.

При вызове xsl:call-template не изменяет контекста преобразования. Фактически, вызов именованного шаблона эквивалентен замене в тексте преобразования элемента xsl:call- template на тело вызываемого шаблона.

Приведем пример.

Листинг 5.6. Входящий документ

<content>

 Just a few words...

</content>

Листинг 5.7. Преобразование

<xsl:stylesheet

 version='1.0'

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

<xsl:template match='/'>

 <html>

  <xsl:call-template name='head'/>

  <body><xsl:copy-of select='content/node()'/></body>

 </html>

</xsl:template>

<xsl:template name='head'>

 <head>

  <meta name='keywords' content='XSLT, XPath, XML'/>

  <meta name='description'

   content='This site is dedicated to XSLT and Xpath.'/>

  <title>XSLTdev.ru - XSLT developer resource</title>

  <link rel='stylesheet' type='text/css' href='style/main.css'/>

 </head>

</xsl:template>

</xsl:stylesheet>

Листинг 5.8. Выходящий документ

<html>

 <head>

  <meta name='keywords' content='XSLT, XPath, XML'>

  <meta name='description'

   content='This site is dedicated to XSLT and Xpath.'>

  <title>XSLTdev.ru - XSLT developer resource</title>

  <link rel='stylesheet' type='text/css' href='style/main.css'>

 </head>

 <body>Just a few words...</body>

</html>

Примечание

Несколько более эффективным способом использования в документе статических частей (как содержимое элемента head в приведенном примере) является хранение этих частей во внешних документах и вставка их в выходящий документ при помощи элемента xsl:copy-of и функции document.

В этом примере шаблон, обрабатывающий корневой элемент, фактически эквивалентен шаблону вида:

<xsl:template match='/'>

 <html>

  <head>

   <meta name='keywords' content='XSLT, XPath, XML'/>

   <meta name='description'

    content='This site is dedicated to XSLT and Xpath.'/>

   <title>XSLTdev.ru - XSLT developer resource</title>

   <link rel='stylesheet' type='text/css' href='style/main.css'/>

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

0

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

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