такие элементы, как xsl:call-template, xsl:apply-templates и так далее. То есть переменной можно присвоить результат выполнения одного или нескольких шаблонов.

Использование внешних документов в преобразовании, как правило, сопровождается громоздкими выражениями вида:

document('http://www.xmlhost.com/docs/а.xml')/page/request/param

и так далее.

Для того чтобы при обращении к внешнему документу не использовать каждый раз функцию document, можно объявить переменную, которая будет содержать корневой узел этого документа, например:

<xsl:variable

 name='a.xml'

 select='document('http://www.xmlhost.com/docs/a.xml')'/>

После этого к документу http://www.xmlhost.com/docs/a.xml можно обращаться посредством переменной с именем a.xml, например:

<xsl:value-of select='$a.xml/page/request/param'/>

Параметры

Параметры в XSLT практически полностью идентичны переменным. Они точно так же связывают с объектом имя, посредством которого в дальнейшем можно к этому объекту обращаться. Главным различием является то, что значение, данное параметру при инициализации, является всего лишь значением по умолчанию, которое может быть переопределено при вызове.

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

Работа с параметрами обеспечивается двумя элементами — xsl:param, который объявляет в шаблоне новый параметр и xsl:with-param, который указывает значение параметра при вызове шаблона.

Элемент xsl:param

Синтаксически этот элемент задается как:

<xsl:param

 name='имя'

 select='выражение'>

 <!-- Содержимое: шаблон -->

</xsl:param>

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

Элемент xsl:param объявляет параметр с именем, которое задается обязательным атрибутом name. Имя параметра может иметь расширенную форму, например 'user:param', но чтобы не возиться с пространствами имен, на практике имена всегда дают простые — типа 'i' или 'myParam'.

Параметру может быть присвоено значение по умолчанию — то есть значение, которое будет использоваться в случае, если параметра с таким именем шаблону передано не было. Значение по умолчанию вычисляется следующим образом:

□ если в элементе xsl:param определен атрибут select, то значением по умолчанию будет результат вычисления выражения, указанного в этом атрибуте;

□ если атрибут select не определен, но сам элемент xsl:param имеет дочерние узлы, то значением определяемого параметра по умолчанию будет фрагмент дерева, полученного в результате выполнения содержимого xsl:param;

□ если атрибут select не определен и при этом сам элемент xsl:param пуст, то значением параметра по умолчанию будет пустая строка.

Примеры

Элемент

<xsl:param name='x' select='2 * 2'/>

создаст параметр, значением которого по умолчанию будет 4. Точно такой же эффект будет иметь элемент

<xsl:param name='x' select='2 * 2'>

 <xsl:value-of select='5 * 5/>

</xsl:param>

Его содержимое не будет приниматься в расчет, поскольку в xsl:param присутствует атрибут select. Если же убрать атрибут select:

<xsl:param name='x'>

 <xsl:value-of select='5 * 5/>

</xsl:param>

то значение параметра x по умолчанию действительно будет результатом вычисления его содержимого. Однако, вопреки довольно здравому разумению, этим значением не будет число 25 и даже не строка '25' и тем более не множество, состоящее из текстового узла со значением 25. Значением параметра x по умолчанию будет результирующий фрагмент дерева, корень которого будет иметь единственный текстовый узел со значением '25' (рис. 5.3).

Рис. 5.3. Фрагмент дерева, который будет значением параметра x по умолчанию

Не стоит пугаться такой структуры в качестве значения параметра. То, что параметр x вдруг будет содержать дерево, ничуть не ограничивает его использование, ведь дерево при потребности может быть приведено к числу или к строке; к множеству узлов же не может быть приведен ни один тип данных.

Предупреждение

Напомним, что при приведении дерева к булевому типу, результатом всегда будет истина. Дерево всегда содержит как минимум корневой узел, и поэтому оно никогда не будет считаться пустым.

Определение параметра вида:

<xsl:param name='x'/>

то есть когда в нем нет ни атрибута select, ни содержимого, присвоит параметру пустую строку, то есть будет эквивалентно

<xsl:param name='x' select=''''/>

Точно так же, как и в случае с переменными, значение заданного в шаблоне параметра можно

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

0

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

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