Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Таким образом, объявление переменной в XSLT происходит всего в два шага:
□ сначала вычисляется значение присваиваемого выражения;
□ затем полученное значение связывается с указанным именем.
Значение присваиваемого выражения вычисляется в зависимости от того, как был определен элемент xsl:variable
:
□ если в элементе xsl:variable
определен атрибут select
, то значением присваиваемого выражения будет результат вычисления выражения, указанного в этом атрибуте;
□ если атрибут select
не определен, но сам элемент xsl:variable
имеет дочерние узлы (иными словами, содержит шаблон), значением определяемой переменной будет результирующий фрагмент дерева, полученный в результате выполнения содержимого xsl:variable
;
□ если атрибут select
не определен и при этом сам элемент xsl:variable
пуст, значением параметра по умолчанию будет пустая строка.
Использовать значения, присвоенные переменным при инициализации, можно, указывая впереди имени переменной символ " $
", например для переменной x
— $x
. В XPath-выражениях синтаксис обращения к переменным соответствует продукции VariableReference
.
Имя переменной соответствует синтаксическому правилу QName
, иными словами, оно может иметь вид имя
или префикс : имя
. Как правило, имена переменным даются без префиксов, однако в том случае, если префикс все же указан, переменная ассоциирует с некоторым объектом не простое, а расширенное имя. Соответственно, обращение к объекту должно будет производиться также посредством расширенного имени.
Область видимости переменных
Каждая из переменных имеет собственную область видимости (англ. scope) — область, в которой может быть использовано ее значение. Область видимости определяется следующим образом.
□ Областью видимости глобальной переменной является все преобразование, то есть значение переменной, объявленной элементом верхнего уровня, может быть использовано в преобразовании где угодно. К такой переменной можно обращаться даже до ее объявления, единственным ограничением является то, что переменная не должна определяться через собственное значение — явно или неявно.
□ Локальную переменную можно использовать только после ее объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент xsl:variable
. В терминах XPath область видимости локальной переменной будет определяться выражением
following-sibling:node()/descendant-or-self:node()
.
Для того чтобы до конца прояснить ситуацию, приведем несколько примеров.
Предположим, что мы определяем переменную с именем ID
и значением 4
следующим образом:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
...
Несложно видеть, что здесь мы определили глобальную переменную, а значит, ее значение можно использовать в преобразовании в любом месте. Например, мы можем определить через нее другие глобальные переменные, либо использовать в шаблоне:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
...
Причем, как уже было сказано, глобальная переменная может быть использована и до объявления: в нашем случае переменная leaf
определяется через переменную ID
, a path
— через leaf
. Конечно же, не следует забывать и то правило, что переменные не могут объявляться посредством самих себя, явно или неявно. Очевидно, что объявление:
было бы некорректным ввиду явного использования переменной при собственном определении. Точно так же были бы некорректны определения:
поскольку переменная ID
определяется через переменную id
, которая определяется через переменную ID
и так до бесконечности.
Дела с локальными переменными обстоят чуть-чуть сложнее. Для того чтобы объяснить, что же такое область видимости, обратимся к следующему преобразованию.
version="1.0"
xmlns:xsl="... ">
name="i"
select="2"/>
name="j"
select="$i - 1"/>
is greater than
В этом преобразовании определены три локальные переменные — i
, j
и k
и одна глобальная переменная — gt
. На следующих четырех листингах мы выделим серой заливкой область видимости переменной (то есть область, где ее можно использовать), а само определение переменной отметим полужирным шрифтом.
Область видимости переменной i
Область видимости переменной j
version="1.0" xmlns:xsl="... "> version="1.0" xmlns:xsl="... ">
select="2"/> select="2"/>
select="$i - 1"/> select="$i - 1"/>
is greater than is greater than
Область видимости переменной k
Область видимости переменной gt
version="1.0" xmlns:xsl="... "> version="1.0" xmlns:xsl="... ">
select="2"/> select="2"/>
select="$i - 1"/> select="$i - 1"/>
is greater than is greater than
В XSLT действует то же правило, что и во многих других языках программирования: нельзя дважды определять переменную с один и тем же именем. Однако и тут есть свои особенности.
□ Имена двух глобальных переменных могут совпадать в том и только том случае, когда они имеют разный порядок импорта. Например, если переменные с одинаковыми именами определены в разных преобразованиях, одно из них может быть импортировано. В этом случае переменная будет иметь значение, которое задано элементом xsl:variable
со старшим порядком импорта.
□ Допускается совпадение имен локальной и глобальной переменных — в этом случае в области видимости локальной переменной будет использоваться локальное значение, в области видимости глобальной (но не локальной) — глобальное значение. Иными словами, локальные переменные "закрывают" значения глобальных.
□ Две локальные переменные могут иметь совпадающие имена в том и только том случае, если их области видимости не пересекаются.
Первое правило мы уже упоминали, когда разбирали порядок импорта: тогда мы сказали, что переменные со старшим порядком импорта переопределяют переменные с младшим порядком импорта. Это довольно важное обстоятельство, поскольку оно добавляет некоторые интересные возможности, но при этом также может породить скрытые ошибки.
Предположим, что в следующем преобразовании в шаблоне с именем choice
мы генерируем два элемента input
.
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Результатом этого преобразования будет следующий фрагмент:
Читать дальшеИнтервал:
Закладка: