□ Не учитывается, был ли пустой элемент определен как <b></b>
или <b/>
.
Одним словом, предложенная выше модель не учитывает информацию, которая не важна с точки зрения структуры документа. На практике помимо структуры бывает также важен и детальный синтаксис документа (например, необходимо вместо  
выводить
). К сожалению, применение XSLT для таких задач ограничено вследствие ограничений самой модели документа.
Порядок просмотра документа
Узлы дерева XML-документа находятся в определенном порядке, который называется порядком просмотра документа (англ. document order). Этот порядок важен для вычисления XPath-вырэжений, которые оперируют множествами узлов. Несмотря на то, что эти множества не имеют внутреннего порядка, при вычислении выражений узлы в них будут перебираться в прямом или обратном порядке просмотра документа в зависимости от того, какие оси навигации применяются в выражении.
Порядок просмотра документа — это порядок, который соответствует появлению в документе первого символа текстовой записи узла. Например, для элементов это будет порядок появления в документе открывающих тегов.
Более четко порядок просмотра документа определяется следующими правилами:
□ корневой узел является первым узлом в порядке просмотра документа;
□ узлы элементов предшествуют своим дочерним узлам, узлам пространств имен и узлам атрибутов;
□ узлы пространств имен предшествуют узлам атрибутов;
□ узлы атрибутов предшествуют другим дочерним узлам своего элемента;
□ остальные узлы упорядочиваются в последовательности их появления в документе.
Обратным порядком просмотра документа называется порядок, который в точности противоположен обычному порядку просмотра документа. Обычный порядок просмотра документа также называют прямым порядком или порядком документа.
В качестве примера приведем схему дерева и выясним порядок просмотра
следующего документа:
<!-- Start -->
<?арр open?>
<а level="0" xmlns:b="urn:b" xmlns="urn:a">
alpha
<b:bravo/><!-- To do... --><charlie/>
delta
</a>
<?app close?>
Дерево этого документа показано на рис. 3.11. Порядок просмотра данного документа будет следующим:
□ корневой узел;
□ узел комментария <!-- start -->
;
□ узел инструкции по обработке <?app open?>
;
□ узел элемента a
;
□ узел пространства имен "urn:а"
;
□ узел пространства имен "urn:b"
;
□ атрибут level
;
□ текстовый узел "alpha
";
□ узел элемента b:bravo
;
□ узел пространства имен "urn:а"
;
□ узел пространства имен "urn:b
";
□ комментарий с текстом "To do ...
";
□ элемент charlie
;
□ узел пространства имен "urn:а"
;
□ узел пространства имен "urn:b"
;
□ текстовый узел "delta
";
□ узел инструкции по обработке <?арр close?>
.
Рис. 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 бит.