`

Стивен Холзнер - XSLT

1 ... 76 77 78 79 80 ... 115 ВПЕРЕД
Перейти на страницу:

<xsl:variable name="COLOR">

 <xsl:choose>

  <xsl:when test="@COLOR">

   <xsl:value-of select="@COLOR"/>

  </xsl:when>

  <xsl:otherwise>blue</xsl:otherwise>

 </xsl:choose>

</xsl:variable>

Строковое значение фрагмента результирующего дерева (то есть либо значение атрибута COLOR, либо значение по умолчанию, «blue») присваивается переменной COLOR. Теперь в выражениях XPath можно обращаться к значению этой переменной, $COLOR, а не к значению атрибута (@COLOR, гарантированно получая при этом значение цвета, даже если у соответствующего элемента отсутствует атрибут COLOR.

Вот еще один пример фрагмента результирующего дерева. В этом случае я сохраняю элемент буквального результата в переменной START_HTML:

<?xml version="1.0"?>

<xsl:stylesheet version="1.1"

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

 <xsl:output method="html"/>

 <xsl:variable name="START_HTML">

  <HEAD>

   <TITLE>

    My page

   </TITLE>

  </HEAD>

 </xsl:variable>

 .

 .

 .

Теперь я могу использовать этот элемент буквального результата где угодно:

<?xml version="1.0"?>

<xsl:stylesheet version="1.1"

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

 <xsl:output method="html"/>

 <xsl:variable name="START_HTML">

  <HEAD>

   <TITLE>

    My page

   </TITLE>

  </HEAD>

 </xsl:variable>

 <xsl:template match="PLANETS">

  <HTML>

   <xsl:copy-of select="$START HTML"/>

   <BODY>

    <H1>Welcome to my page</H1>

   </BODY>

  </HTML>

 </xsl:template>

</xsl:stylesheet>

И вот результат:

<HTML>

 <HEAD>

  <TITLE>

   My page

  </TITLE>

 </HEAD>

 <BODY>

  <H1>Welcome to my page</H1>

 </BODY>

</HTML>

Однако поскольку теперь фрагменты результирующего дерева не допускаются в XSLT 1.1, этот пример работать не будет. Как же тогда сохранить весь элемент буквального результата одновременно с возможностью простого вызова? Вы можете создать именованный шаблон.

Элемент <xsl:call-template>: применение именованных шаблонов

У элемента <xsl:template> есть атрибут name, задающий имя шаблона. Предположим, у меня есть элемент буквального результата, состоящий из двух элементов <BR> и двух элементов <HR> HTML, при помощи которого я создаю в документах HTML вертикальный разделитель:

<BR/>

<HR/>

<BR/>

<HR/>

Тогда я могу создать шаблон с именем «separator» (разделитель), использующий этот элемент буквального результата:

<xsl:template name="separator">

 <BR/>

 <HR/>

 <BR/>

 <HR/>

</xsl:template>

Это именованный шаблон — для его создания нужно только присвоить имя атрибуту name элемента <xsl:template>.

Заметьте, что этот шаблон не установлен для выбора чего-то конкретного. Для активизации шаблона необходимо вызвать его явно. Для этого служит элемент <xsl:call-template>, обладающий только одним атрибутом:

• name (обязательный). Имя вызываемого шаблона, устанавливается в QName.

Следующий пример демонстрирует применение нашего шаблона «separator», для чего мне нужно было только вызвать его в соответствующих местах:

<?xml version="1.0"?>

<xsl:stylesheet version="1.1"

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

 <xsl:template match="/PLANETS">

  <HTML>

   <HEAD>

    <TITLE>

     The Planets Table </TITLE>

    </HEAD>

    <BODY>

     <H1>

      The Planets Table

     </Н1>

     <xsl:call-template name="separator"/>

     <TABLE BORDER="2">

      <TR>

       <TD>Name</TD>

       <TD>Mass</TD>

       <TD>Radius</TD>

       <TD>Day</TD>

      </TR>

      <xsl:apply-templates/>

     </TABLE>

     <xsl:call-template name="separator"/>

    </BODY>

   </HTML>

  </xsl:template>

  <xsl:template match="PLANET">

   <TR>

    <TD><xsl:value-of select="NAME"/></TD>

    <TD><xsl:apply-templates select="MASS"/></TD>

    <TD><xsl:apply-templates select="RADIUS"/></TD>

    <TD><xsl:apply-templates select="DAY"/></TD>

   </TR>

 </xsl:template>

 <xsl:template match="MASS">

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

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template match="RADIUS">

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

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template match="DAY">

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

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template name="separator">

  <BR/>

  <HR/>

  <BR/>

  <HR/>

 </xsl:template>

</xsl:stylesheet>

Вот результат. Обратите внимание: элементы <BR> и <HR> были вставлены так, как требовалось:

<HTML>

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </H1>

  <BR>

  <HR>

  <BR>

  <HR>

  <TABLE BORDER="2">

   <TR>

    <TD>Name</TD>

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <TR>

    <TD>Mercury</TD>

    <TD>.0553 (Earth = 1)</TD>

    <TD>1516 miles</TD>

    <TD>58.65 days</TD>

   </TR>

   <TR>

    <TD>Venus</TD>

    <TD>.815 (Earth = 1)</TD>

    <TD>3716 miles</TD>

    <TD>116.75 days</TD>

   </TR>

   <TR>

    <TD>Earth</TD>

    <TD>1 (Earth = 1)</TD>

    <TD>2107 miles</TD>

    <TD>1 days</TD>

   </TR>

  </TABLE>

  <BR>

  <HR>

  <BR>

  <HR>

 </BODY>

</HTML>

Результирующий документ показан на рис. 9.1.

Рис. 9.1. Вызов именованного шаблона

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

Элементы <xsl:param> и <xsl:with-param>: создание параметров

Параметры во многом похожи на переменные — за тем исключением, что они обычно используются вместе с именованными шаблонами. Параметры позволяют вам передать в шаблон какие-то значения. Параметры создаются элементом <xsl:param>, обладающим двумя атрибутами:

• name (обязательный). Имя переменной, устанавливается в QName;

• select (необязательный). Значение параметра по умолчанию. Устанавливается в выражение XPath.

Аналогично <xsl:variable>, этот элемент может либо быть элементом высокого уровня, либо применяться внутри тела шаблона. Параметры, созданные элементами <xsl:param>, являются глобальными, а созданные внутри шаблонов — локальными. При создании параметра внутри тела шаблона, элемент <xsl:param> должен быть расположен перед какими-либо другими дочерними элементами. Элемент может также содержать необязательное тело шаблона, создающее фрагмент результирующего дерева — в XSLT 1.1 это уже не разрешено. Если элемент содержит тело, атрибут select использовать нельзя.

1 ... 76 77 78 79 80 ... 115 ВПЕРЕД
Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Стивен Холзнер - XSLT, относящееся к жанру Интернет. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)