
- •Лекция 4-08
- •5.3.9. Создание текстовых узлов вXslt
- •5.3.9.1. Элементxsl:text
- •5.3.9.2. Элементxsl:value-of
- •5.3.9.3. Встроенные правила шаблона
- •1. Поздравление
- •2. Напоминание
- •5.3.9.4. Обработка пробельных символов
- •5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен вXslt
- •5.3.10.1. Элемент xsl:document
- •5.3.10.2. Элементxsl:result-document
- •5.3.10.3. Элементxsl:comment
- •5.3.10.4. Элемент xsl:processing-instruction
- •5.3.10.5. Элементxsl:namespace
- •5.3.11. Копирование узлов вXslt
- •5.3.11.1. Элементxsl:copy
- •5.3.11.2. Элементxsl:copy-of
- •5.3.11.3. Элементxsl:sequence
- •5.3.12. Условная и циклическая обработка вXslt
- •5.3.12.1. Элементxsl:if
- •5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •5.3.12.3. Элементxsl:for-each
- •5.3.12.4. Сортировка вXslt
- •5.3.13. Сообщения процессораXslt
- •5.3.14. Псевдонимы пространства имен вXslt
- •5.3.15. Нумерация вXslt
- •3. Поздравление
- •1. Поздравление
- •1. Поздравление
- •01). Поздравление
- •0:00:00:00:01)Поздравление
- •5.3.16. Форматирование чисел в xslt
- •5.3.17. Использование ключей вXslt
- •5.3.18. Переменные, параметры и функции вXslt
- •5.3.18.1. Переменные в xslt
- •5.3.18.2. Вызов именованных правил шаблона
- •5.3.18.3. Параметры в xslt
- •5.3.18.4. Функции стилей в xslt
- •5.3.19. Дополнительные функции xslt
- •5.3.19.1. Функцияdocument()
- •5.3.19.2. Функцияcurrent()
- •5.3.19.3. Функцияgenerate-id()
- •5.3.19.4. Функция system-property()
- •5.3.19.5. Функцияunparsed-entity-uri()
- •5.3.20 Использование расширений вXslt
- •5.3.20.1. Средства расширенияXslt
- •5.3.20.2. Инициатива exslt
- •5.3.20.3. Средства расширения в процессореMsxml
- •5.3.20.4. Средства расширения в процессореSaxon
5.3.18. Переменные, параметры и функции вXslt
Переменные и параметры в XSLTпохожи между собой и сильно отличаются от переменных в других языках программирования.
5.3.18.1. Переменные в xslt
Переменные в XSLT не могут быть изменены, т.е. фактически они эквиваленты переменным с модификатором const в C или переменным с модификатором final в Java. По этой причине вXSLT нет оператора присваивания, а переменные и параметры только инициализируются при объявлении.
Для объявления переменных в XSLTслужит элементxsl:variable, который может как присутствовать в теле правила шаблона, так и быть элементом верхнего уровня. Синтаксис этого элемента в XSLT определен следующим образом:
<xsl:variable
name="имя"
select="выражение"
as="тип-переменной"
>
<!--
Содержимое: конструктор последовательности
-->
</xsl:variable>
Элемент xsl:variableсвязывает имя, указанное в обязательном атрибутеname, со значением выражения, указанного в необязательном атрибутеselectили с деревом, которое является результатом выполнения правила шаблона, содержащегося в этом элементе. В том случае, если объявление переменной было произведено элементом верхнего уровня, переменная называется глобальной переменной. Переменные, определенные элементамиxsl:variableв правилах шаблона (то есть не на верхнем уровне) называются локальными переменными.
Необязательный атрибут asзадает тип переменной (один из типов XPath).
Значение присваиваемого выражения вычисляется в зависимости от того, как был определен элемент xsl:variable:
если в элементе xsl:variableопределен атрибутselect, то значением присваиваемого выражения будет результат вычисления выражения, указанного в этом атрибуте;
если атрибут selectне определен, но сам элементxsl:variableимеет дочерние узлы (иными словами, содержит шаблон), значением определяемой переменной будет результирующий фрагмент дерева, полученный в результате выполнения содержимогоxsl:variable;
если атрибут selectне определен и при этом сам элементxsl:variableпуст, значением параметра по умолчанию будет пустая строка.
Использовать значения, присвоенные переменным при инициализации, можно, указывая впереди имени переменной символ "$", например для переменнойx–$x.
Имя переменной соответствует синтаксическому правилу QName, т.е. может иметь видимяилипрефикс:имя. Как правило, имена переменным даются без префиксов, однако в том случае, если префикс все же указан, переменная ассоциирует с некоторым объектом не простое, а расширенное имя. Соответственно, обращение к объекту должно будет производиться также посредством расширенного имени.
Каждая из переменных имеет собственную область видимости (scope), т.е. область, в которой может быть использовано ее значение. Область видимости определяется следующим образом:
областью видимости глобальной переменной является все преобразование, то есть значение переменной, объявленной элементом верхнего уровня, может быть использовано в преобразовании где угодно. К такой переменной можно обращаться даже до ее объявления, единственным ограничением является то, что переменная не должна определяться через собственное значение – явно или неявно.
локальную переменную можно использовать только после ее объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент xsl:variable. В терминахXPathобласть видимости локальной переменной будет определяться выражением
following-sibling:node()/descendant-or-self:node().
Пример определения глобальных переменных:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
…
<xsl:variable name="ID" select="4"/>
<xsl:variable name="leaf" select="//item[@id=$ID]"/>
<xsl:variable name="path"
select="$leaf/ancestor-or-self::item"/>
…
</xsl:stylesheet>
Пример определения локальных переменных:
<xsl:stylesheet
version="l.0"
xmlns:xsl="... ">
<xsl:template match="/">
<xsl:variable
name="i"
select="2"/>
<xsl:variable
name="j"
select="$i - 1"/>
</xsl:template>
</xsl:stylesheet>
В XSLTдействует то же правило, что и во многих других языках программирования: нельзя дважды определять переменную с один и тем же именем, за исключением следующих случаев:
имена двух глобальных переменных могут совпадать в том и только том случае, когда они имеют разный порядок импорта. Например, если переменные с одинаковыми именами определены в разных преобразованиях, одно из них может быть импортировано. В этом случае переменная будет иметь значение, которое задано элементом xsl:variableсо старшим порядком импорта.
допускается совпадение имен локальной и глобальной переменных – в этом случае в области видимости локальной переменной будет использоваться локальное значение, в области видимости глобальной (но не локальной) – глобальное значение.
две локальные переменные могут иметь совпадающие имена в том и только том случае, если их области видимости не пересекаются.
Переменные в XSLT используются в следующих основных случаях:
переменные могут содержать значения выражений, которые много раз используются в преобразовании (это избавит процессор от необходимости пересчитывать выражение каждый раз по-новому);
переменной может присваиваться результат преобразования, что позволяет манипулировать уже сгенерированными частями документа;
переменные могут использоваться для более прозрачного доступа к внешним документам.
Пример использования переменной:
<xsl:variable name="links" select="//a[@href]"/>
Используя затем в шаблоне имя переменной – $links, можно избежать многократной записи одного и того же выражения (особенно если оно является громоздким). Кроме того, если необходимо изменить значение переменной, это изменение делается только в элементеxsl:variable.