- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Технология XSLT - Алексей Валиков
Шрифт:
Интервал:
Закладка:
Рис. 3.11. Схема дерева XML-документа
Соответственно, обратный порядок просмотра документа будет начинаться с инструкции по обработке <?app close?> и заканчиваться корневым элементом.
Типы данных
Многие языки программирования при объявлении переменной требуют указывать, какой тип данных будет ей присваиваться. Например, в языке Java код
int i = 15;
объявит переменную целого типа int с именем i и присвоит ей значение 15. В этом случае тип данных ставится в соответствие переменной. XSLT относится к динамически типизируемым языкам, в которых тип данных ассоциируется не с переменными, а со значениями.
В XSLT выделяется пять типов данных:
□ булевый тип (boolean);
□ численный тип (number);
□ строковый тип (string);
□ множество узлов (node-set);
□ результирующий фрагмент дерева (result tree fragment).
Ниже мы подробно рассмотрим особенности работы со всеми пятью типами данных.
Булевый тип (boolean)
Булевый тип данных в XSLT может принимать два значения — true ("истина") и false ("ложь"). В XSLT нет констант для выражения тождественной "истины" или "лжи", как во многих других языках программирования, для этих целей следует использовать функции true и false.
Значение булевого типа могут быть получены путем сравнения других типов данных при помощи операторов сравнения (таких как "=", ">", "<") или как результат вычисления более сложных логических выражений с использованием операторов "and", "or" и функции not.
Булевый тип может быть неявно преобразован в число (0 для false и 1 для true) или в строку ("false" и "true" соответственно).
Примеры:
1=2 → 0 (число)
not((2>1) and (2>3)) → "true" (строка)
Численный тип (number)
Численный тип в XSLT определяется как 64-битное значение с плавающей точкой, двойной точности, соответствующее стандарту IEEE 754-1985. Этот стандарт используется во многих других языках программирования, и потому можно сказать, что арифметика в XSLT работает "как обычно". Вместе с тем, стандарт IEEE 754 имеет свои нюансы, которые обязательно надо учитывать в практике программирования на XSLT.
Согласно строгому определению, числа в XSLT имеют форму s×m×2x, где s — знак числа, m — его мантисса, а x — экспонента. Эти числа имеют следующие значения:
□ знак (s) равен +1 для положительных чисел и -1 для отрицательных;
□ мантисса (m) — это положительное целое число в интервале от 0 до 253-1 включительно;
□ экспонента (x) — это целое число в интервале от -1075 до 970 включительно.
Таким образом, числа в XSLT находятся в интервале приблизительно от -10317 до 10317.
Кроме этого выделяются пять особых значений.
□ Отрицательная бесконечность. Это значение представляет отрицательные числа, меньшие, чем -10317; оно соответствует математическому значению -∞. Отрицательная бесконечность может быть результатом таких операций, как деление отрицательного числа на нуль или умножение двух очень больших (в абсолютном значении) чисел разного знака в случае, когда для записи их произведения не хватит 64 бит.
□ Положительная бесконечность. Это значение представляет очень большие положительные числа, превосходящие 10317; оно соответствует математическому значению ∞. Положительная бесконечность может быть результатом таких операций, как деление положительного числа на нуль или умножение двух очень больших (в абсолютном значении) чисел одного знака в случае, когда для записи их произведения не хватит 64 бит.
□ Отрицательный нуль. Это значение соответствует значению предела -1/x при x, стремящемся к бесконечности. Отрицательный нуль может быть результатом таких операций, как деление отрицательного числа на бесконечность или положительного числа на отрицательную бесконечность. Отрицательный нуль может также быть получен путем деления отрицательного числа на очень большое положительное число, или, наоборот, в случае, когда для записи частного не хватает 64-битной точности.
□ Положительный нуль (предел 1/x при x, стремящемся к бесконечности). Результат таких операций, как вычитание числа из самого себя, деление положительного числа на положительную бесконечность или отрицательного — на отрицательную бесконечность. Положительный нуль может также быть частным деления двух чисел одного знака, если для записи результата не хватает 64-битной точности.
□ Особое значение NaN, "не-число" (англ. "not-a-number"). Результат преобразования нечислового строкового значения в числовой формат.
Примеры особых значений:
-1 div 0 → отрицательная бесконечность
1 div 0 → положительная бесконечность
1 div (-1 div 0) → отрицательный нуль
-1 div (1 div 0) → отрицательный нуль
1 div (1 div 0) → положительный нуль
-1 div (-1 div 0) → положительный нуль
1-1 → положительный нуль
number('one') → NaN, не-число
number('NaN') → NaN, не-число
Все числовые значения, кроме NaN являются упорядоченными, иначе говоря, для них определены операции сравнения.
□ Отрицательная бесконечность является наименьшим численным значением. Две отрицательные бесконечности равны между собой.
□ Отрицательные конечные числа больше отрицательной бесконечности, но меньше отрицательного нуля.
□ Отрицательный и положительный нули считаются равными.
□ Положительные конечные числа больше положительного нуля, но меньше положительной бесконечности.
□ Положительная бесконечность является наибольшим числом. Две положительные бесконечности находятся в равенстве, все остальные числа всегда будут меньше.
Примеры□ 1 div (1 div 0) < 1 div 0 → true
(положительный нуль меньше положительной бесконечности);
□ 1 div 0 < 2 div 0 → false
(положительный нуль равен другому положительному нулю);
□ -2 div 0 > -1 div 0 > false -1 div 0 = -2 div 0 → true
(отрицательные бесконечности равны между собой);
□ -1 div 0 < -1 → true
(отрицательная бесконечность меньше любого отрицательного числа);
□ -1 < -2 div (1 div 0) → true
(любое отрицательное число меньше отрицательного нуля);
□ -2 div (1 div 0) = 1-1 → true
1 div (1 div 0) > -2 div (1 div 0) → false
(отрицательный нуль равен положительному нулю);
□ 1 > 1 div (1 div 0) → true
(любое положительное число превосходит положительный нуль).
Нечисловые значения, NaN, являются неупорядоченными — это означает, что, сравнивая их с другими числами, нельзя установить — больше они, меньше или равны. Результат сравнений операторами "<", "<=", "=", ">", ">=" будет "ложью", если хотя бы одно из сравниваемых значений — NaN. Единственное, что можно с точностью сказать о NaN — это то, что они не равны никакому другому числу, включая, собственно, нечисловые значения. То есть, если хотя бы один из операндов — NaN, результатом сравнения с использованием оператора "!=" будет "истина". Это влечет за собой интересный способ проверки, является ли значение некоторой переменной нечисловым или нет: выражение $x!=$x (буквально значение переменной x не равно значению переменной x) обратится в "истину" в том и только том случае, если значением $x является NaN. В шаблонных правилах эта проверка может быть записана при помощи элемента xsl:if:
<xsl:if test="$x != $x">
<xsl:text>This is not a number (NaN).</xsl:text>
</xsl:if>
Арифметические операции в XSLT никогда не вызывают ошибки. Деление на нуль, не разрешенное во многих языках программирования, не является для XSLT исключительной ситуацией. Частным такого деления будет положительная или отрицательная бесконечность. Но все же, следует осторожно использовать "опасные" выражения, например, в сравнениях. Несколько необычное поведение операторов сравнения в операциях с NaN может создать в программе курьезные, но трудно обнаруживаемые ошибки — можно легко забыть о том, что некоторые значения могут быть не равны сами себе.