□ xsl:param;
□ xsl:processing-instruction;
□ xsl:text;
□ xsl:value-of;
□ xsl:variable.
Элементы xsl:param и xsl:variable, которые входят в этот список в преобразовании, могут быть как элементами верхнего уровня, так и инструкциями. В первом случае они определяют глобальные параметры и переменные, во втором — локальные.
Если элементы xsl:param используются для определения локальных переменных, они должны быть первыми дочерними элементами xsl:template, то есть, строго говоря, определение
<xsl:template name='page'>
<xsl:text>Text</xsl:text>
<xsl:param name='foo'/>
</xsl:template>
будет некорректным. На самом деле многие процессоры игнорируют эту ошибку, вполне разумно считая, что ничего смертельного в ней нет. Но, конечно, лучше использовать стандартный вариант:
<xsl:template name='page'>
<xsl:param name='foo'/>
<xsl:text>Text</xsl:text>
</xsl:template>
Переменные и параметры
Было бы слишком просто и слишком бесполезно лишь констатировать, что переменные и параметры в XSLT похожи между собой и сильно отличаются от переменных в других языках программирования. Мы попытаемся разобраться в этом вопросе несколько глубже —
В классической книге Монти Бен-Ари 'Языки программирования' [Бен-Ари 2000] приводится следующее определение переменной:
Затем следует комментарий:
Если немного сменить уровень абстракции, первая часть этого определения верна и по отношению к параметрам, и переменным XSLT (далее мы будем говорить просто 'переменные', поскольку различия между ними на данный момент несущественны). Конечно, где-то там внутри реализации конкретного XSLT- процессора есть память, поделенная на ячейки, в которой процессор хранит информацию. Такие детали нас, естественно, не интересуют, ибо мы больше рассуждаем о логических, чем о физических моделях. В логической же модели переменная представляется как объект определенного типа, с которым связано имя, — по этому имени мы можем обращаться к объекту, использовать его значение и так далее. Иными словами, в XSLT под переменной понимается не более чем ассоциация между значением и именем, и если мы вдруг скажем, что переменная x имеет значение 5, это будет означать, что имя 'x' связано объектом численного типа, значение которого равно 5. Заметим небольшую разницу с определением Бен-Ари: мы не говорим о том, что число 5 лежит в какой-то ячейке памяти (хотя, несомненно, оно так и есть) и что этой ячейке присвоено имя 'x' — мы говорим об ассоциации между объектом и именем и только.
Теперь, когда более или менее ясно, что же мы имеем в виду под переменными, на новой строчке полужирным шрифтом напишем следующее:
Разработчикам, которые использовали в своей практике только процедурные языки и не имеют опыта функционального или логического программирования будет очень нелегко смириться с такой ситуацией. То, что
Практически во всех процедурных языках оператор присваивания вида
с незначительными вариациями работает приблизительно следующим образом:
□ сначала вычисляется присваиваемое выражение;
□ затем вычисляется адрес переменной;
□ затем значение, полученное на первом шаге, копируется в ячейки памяти, начиная с адреса, полученного на втором шаге присваивания.
В XSLT нет оператора присваивания. Переменным и параметрам никогда не
В конце этой главы мы вернемся к неизменяемым переменным и попытаемся объяснить, почему их нельзя изменить — но прежде мы должны научиться их использовать.
Элемент
Синтаксис этого элемента в XSLT определен так:
<xsl:variable
name='
select='
<!-- Содержимое: шаблон -->
</xsl:variable>
Для объявления переменных в XSLT служит элемент xsl:variable, который может как присутствовать в теле шаблона, так и быть элементом верхнего уровня. Элемент xsl:variable связывает имя, указанное в обязательном атрибуте name, со значением выражения, указанного в атрибуте select или с деревом, которое является результатом выполнения шаблона, содержащегося в этом элементе. В том случае, если объявление переменной было произведено элементом верхнего уровня, переменная называется xsl:variable в шаблонах (то есть не на верхнем уровне) называются
Таким образом, объявление переменной в XSLT происходит всего в два шага:
□ сначала вычисляется значение присваиваемого выражения;
□ затем полученное значение связывается с указанным именем.
Значение присваиваемого выражения вычисляется в зависимости от того, как был определен элемент xsl:variable:
□ если в элементе xsl:variable определен атрибут select, то значением присваиваемого выражения будет результат вычисления выражения, указанного в этом атрибуте;
□ если атрибут select не определен, но сам элемент xsl:variable имеет дочерние узлы (иными словами, содержит шаблон), значением определяемой переменной будет
