Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-08.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
422.91 Кб
Скачать

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.

Соседние файлы в папке Лекции