Главная
страница 1страница 2страница 3

Стилевые таблицы XSL, Переменные и параметры


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

  • Переменная - это имя, присвоенное ячейке памяти или ячейкам, которые могут содержать представление конкретного типа данных

  • Значение переменной может изменяться в процессе выполнения программы.

С точки зрения логической модели преобразования, такие технические детали, как адрес переменной в памяти, нас не интересуют, хотя он несомненно существует. Гораздо более удобным является другое определение:

  • Переменная - это объект определенного типа, с которым связанно имя

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

Теперь, когда с понятием переменной в XSLT кое-что прояснилось, отметим следующий факт: переменнве в XSLT не могут быть измененны! Разработчикам, которые до сих пор не имели опыта логического программирования и использовали в своей пректике традиционные языки программирования, будет нелегко с этим смириться. То, что переменные не могут быть измененны, дискредитирует само название - переменные, ибо они уже более похожи на константы.

В XSLT объявление переменной есть создание ассоциации между объектом и именем.

Элемент xsl:variable


Синтаксис:

<xsl:variable name="имя" select="выражение">

</xsl:variable>

Элемент xsl:variable в XSLT используется для связи имени переменной, указанного атрибутом name со значением. Значение переменной может быть полученно вычислением выражения, заднного необязательным атрибутом select или выполнением шаблона в содержимом элемента. Использовать объявленную таким образом переменную можно, указывая перед именем символ $:

$имя

Переменные XSLT могут быть глобальными и локальными. Если элемент xsl:variable является элементом верхнего уровня, то переменная будет глобальной; если элемент xsl:variable объявлен внутри шаблонного правила - локальной.



Областью видимости глобальной переменной является все преобразование. То есть значение переменной, объявленной элементом верхнего уровня, может быть использовано в преобразовании где угодно. К такой переменной можно обращаться даже до ее объявления. Единственное ограничение: переменная не должна объявляться через собственное значение.

Локальную переменную можно использовать только после объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент xsl:variable. Если существует одноименная глобальная переменноя, то локальная переменная в своей области видимости перекрывает ее. Имена локальных переменных могут совпадать, если их области видимости не пересекаются.




Использование переменных


Как правило, первой реакцией на известие о том, что переменные в XSLT нельзя изменять является реплика: "Да зачем они вообще тогда нужны?". Претензия со стороны процедурного программирования вполне серьезнаа и обоснованна - изменяемые переменные являютсся неотъемлимой частью сложных многошаговых вычислений. Тем не менее, переменные, даже в таком виде, в каком они присутсвуют в XSLT, являются очень важным и полезным элементом языка. Ниже перечислены наиболее типичные случаи использования переменных:

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

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

Попробуем разобраться на примерах.



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

//a


Гораздо удобнее и экономней с точки зрения вычислительных ресурсов объявить переменную вида

<xsl:variable name="links" select="//a" />

и использовать ее в преобразовании как $links. Например:

...количество ссылок в документе: <xsl:value-of select="count($links)" />

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



Объявление

<xsl:variable name="image_path" select="http://www.site.com/chapter-files/images">

Использование

<img>

<xsl:attribute name="src">

<xsl:value-of select="concat($image_path, '/picture1_1.gif')" />

</xsl:attribute

</img>

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

<xsl:template match="/">

<html>

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

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

</html>

</xsl:template>

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

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

если условие1 то

присвоить переменной1 значение1

иначе


присвоить переменной1 значение2

В традиционном языке программирования с изменяемыми переменными (например C++ или Javascript) это выглядело бы так:

переменная1=условие1?значение1:значение2;

или в чуть более широком варианте:

if (условие1) переменная1=значение1

else


переменная1=значение2

Однако если в XSLT написать что нибудь подобное



<xsl:choose>

<xsl:when test="условие1">

<xsl:variable name="переменная1" select="значение1" />

</xsl:when>

<xsl:otherwise>

<xsl:variable name="переменная1" select="значение2" />

</xsl:otherwise>

</xsl:choose>

то требуемого результата все равно не достигли бы по той причине, что переменная будет иметь в этом случае локальную область видимости, ограниченную элементом xsl:when или xsl:otherwise и их дочерними элементами. Правильный шаблон для решения этой задачи выглядит следующим образом:



<xsl:variable name="переменная1"

<xsl:choose>

<xsl:when test="условие1">

<xsl:copy-of select="значение1" />

</xsl:when>

<xsl:otherwise>

<xsl:copy-of select="значение2" />

</xsl:otherwise>

</xsl:choose>

</xsl:variable>

Конечно, это не то же самое - на самом деле мы получаем не само значение, а дерево, содержащее это значение, но для строковых и численных значений особой разницы нет: дерево будет вести себя так, как будто это число или строка (см. правила приведения типов в одном из предыдущих уроков).


Параметры


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

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

Работа с параметрами обеспечивается двумя элементами XSLT:

xsl:param - служит для объявления параметра;

xsl:with-param - указывает значение параметра ри вызове шаблона.

xsl:param


Синтаксис этого элемента следующий:

<xsl:param name="имя" select="выражение">

</xsl:param>

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

Атрибут name задает имя параметра. Имя параметра может имет расширенную форму, например "user:param", однако, чтобы не возиться с пространствами имен, на практике всегда используют простые имена: "i", "count" или что-то в этом роде.

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

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

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

в результате будет получен фрагмент дерева

состоящий из корневого узла и текстового узла "4"

-->

<xsl:param name="x">

<xsl:value-of select="2 * 2" />

</xsl:param>

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



<xsl:param name="x" />

Область видимости параметра определяется так же как область видимости переменной. Единственное, что нужно запомнить - это то, что элементы xsl:param, определяемые в шаблонах, должны всегда быть его первыми дочерними элементами. Абсолютно логично и то, что в одном шаблоне не может быть объявленно 2 или более одноименных параметра, так как их области видимости обязательно будут пересекаться.


xsl:with-param


Синтаксис:

<xsl:with-param name="имя" select="выражение">

</xsl:with-param>

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



  • если в элементе, который вызывает этот шаблон, присутствует элемент xsl:with-param, передающий значение этого параметра, то в шаблоне будет использоваться переданное значение;

  • в противном случае будет использоваться значение по умолчанию.

Продемонстрируем теперь использование более интересных функций - start-with(string,startSubstring) и contains(string,anySubstring). Функция start-with(string,startSubstring) проверяет, начинается ли строка string с подстроки  startSubstring. Пример - ex04-4.xml, ex04-4.xsl.

Синтаксис элемента xsl:if.



В этом элементе мы использовали переменные. Значения переменных были инициализированы ранее





Переменная varStartWith представляет собой подстроку, с которой должны начинаться требуемые нам марки. Она не меняется, поэтому инициализируется перед циклом. Переменная varCarMarka содержит марку автомобиля, она меняется на каждом шаге цикла и, соответственно, инициализируется в теле цикла. Элемент letter XML-файла содержит букву "М".

Результат:

Функция contains(string,anySubstring) проверяет, содержит ли строка string подстроку  anySubstring. Пример - ex04-5.xml, ex04-5.xsl.

Синтаксис элемента xsl:if.

Этот пример полностью аналогичен предыдущему. Элемент letter XML-файла содержит букву "Ш".

Результат.

Два элемента xsl:if, вложенные друг в друга, дают нам эффект оператора AND (ex04-6.xml, ex04-6.xsl).

Соответствующий фрагмент XSL-файла.

























Результат.



Можно добиться и эффекта оператора OR. Для этого нам нужно включить два цикла, в каждом из которых формируется своя выборка   (ex04-7.xml, ex04-7.xsl).

Соответствующий фрагмент XSL-файла.







































Если сортировка не требуется, то можно вставить два элемента xsl:if в один элемент xsl:for-each.

Элемент XSL:IF - улучшение внешнего вида таблиц

Элемент xsl:if можно применять не только для фильтрации строк выборки. Очевидно, что он может быть полезен и во многих других областях. В этом параграфе мы разберем пример использования элемента xsl:if для улучшения внешнего вида таблицы. Заодно мы продемонстрируем реальное использование функции position(). Мы будем использовать эту функцию для того, чтобы чередовать цвет четных и нечетных строк таблицы  (ex04-8.xml, ex04-8.xsl).

Фрагмент XSL-файла, который отвечает за требуемое чередование.



#004EF0

С элементом xsl:if и с функцией position() мы уже знакомы. Операция mod 2 дает нам остаток от деления на 2. А элемент xsl:attribute позволяет нам динамически подставлять в файл результатов различные атрибуты. Это очень мощный элемент, мы разберем еще одно применение этого элемента в следующем параграфе. А сейчас приведем для полноты картины таблицу результатов.



К сожалению, элемент xsl:if в XSLT не может реализовать конструкцию "если-то-иначе". Условный оператор такого вида реализуется при помощи элементов xsl:choose, xsl:when и xsl:otherwise.

Примером применения xsl:choose можно так-же привести "перекрашивание" фона элемента в разные цвета в зависимости от автора т года издания. Элемент xsl:choose содержит один или несколько элементов xsl:when и необязательный элемент xsl:otherwise. При обработке xsl:choose процессор поочередно вычисляет выражения, содержащиеся в атрибутах test элементов xsl:when, приводит их к булевому типу и выполняет содержимое первого (и только первого) элемента xsl:when, тестовое выражение которого равно true. В случае если ни одно из тестовых выражений не дало "истину" в результате и в элементе xsl:choose присутствует xsl:otherwise, процессор выполнит его содержимое.

Как упоминалось ранее, при помощи элемента xsl:choose можно реализовать конструкцию вида "если-то-иначе". Делается это следующим образом:













































Title Author Year

<< предыдущая страница  
Смотрите также:
Методическое пособие по курсу «Язык разметки xml. Часть 1» Методическое пособие для студентов специальности «Компьютерные системы и сети»
682.79kb.
3 стр.
Методическое пособие по курсу «Язык разметки xml. Часть 1» Методическое пособие для студентов специальности «Компьютерные системы и сети»
685.63kb.
3 стр.
Методическое пособие по дисциплине «Статистика» для специальности «Экономика и бухгалтерский учет (по отраслям): Методическое пособие /Под редакцией В. Ю. Ершовой
1269.9kb.
12 стр.
Методическое пособие по курсу персональная электроника жидкокристаллические мониторы Для студентов специальности 200800
254.83kb.
1 стр.
Учебно-методическое пособие по педагогической (методической) практике для студентов IV и V курсов, обучающихся по направлению 050100. 62 «Педагогическое образование»
701.15kb.
4 стр.
Методическое пособие по практике устной и письменной речи английского языка для студентов III-IV курсов
308.25kb.
3 стр.
Методическое пособие по практике устной и письменной речи английского языка для студентов III-IV курсов
271.89kb.
2 стр.
Информационно-методическая часть
28.96kb.
1 стр.
Учебно-методическое пособие для слушателей заочной формы обучения по специальности 210406. 65 «Сети связи и системы коммутации»
829.31kb.
10 стр.
Методическое пособие для студентов всех форм обучения специальности «Физическая культура для лиц с отклонениями в состоянии здоровья
482.09kb.
2 стр.
Учебно-методическое пособие для студентов, обучающихся по специальности 1-08 01 01 «Профессиональное обучение»
590.08kb.
4 стр.
Методическое пособие предназначено для студентов специальности "Психология"
1007.82kb.
6 стр.