Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Результатом обработки элемента
будет строка " true
".
Сравнение всегда требует наличия двух операндов числового типа. Если операнды не являются числами, они будут соответствующим образом преобразованы.
В XPath вполне корректным будет выражение вида A > B > C
. Однако результат его будет довольно неожиданным. В XPath действует правило левой ассоциативности операторов сравнения, поэтому A > B > C
будет равносильно (А > B) > C
. То есть A
будет сравнено с B
, затем результат, истина или ложь, будет преобразован в числовой тип (получится 1
или 0
) и затем сравнен со значением C
.
Пример:
3 > 2 > 1
→ (3 > 2) > 1
→ 1 > 1
→ false
3 > 2 > 0
→ (3 > 2) > 0
→ 1 > 0
→ true
Неравенствам в XPath соответствует продукция RelationalExpr
:
[XP24] RelationalExpr ::= AdditiveExpr
| RelationalExpr '<' AdditiveExpr
| RelationalExpr '>' AdditiveExpr
| RelationalExpr '<=' AdditiveExpr
| RelationalExpr '>=' AdditiveExpr
Операции "равно" и "не равно" записываются при помощи продукции
EqualityExpr:
[XP23] EqualityExpr ::= RelationalExpr
| EqualityExpr '=' RelationalExpr
| EqualityExpr '!=' RelationalExpr
Операции с множествами узлов
Три основные операции с множествами узлов, которые поддерживает язык XPath, — это фильтрация множества, выборка с использованием путей и объединение.
Фильтрация
Множества узлов, которые получаются в результате вычисления выражений, можно фильтровать — то есть выбирать из них узлы, удовлетворяющие заданным свойствам подобно тому, как это делалось предикатами в шагах выборки.
В выражениях множества узлов могут также фильтроваться одним или несколькими предикатами. Узел остается в фильтруемом множестве, только если он удовлетворяет всем предикатам поочередно.
Предположим, что нам нужно оставить в фильтруемом множестве узлов, которое присвоено переменной nodes
, только те узлы, которые имеют имя а
и атрибут href
. Искомое выражение может быть записано следующим образом:
$nodes[self::а][@href]
Можно использовать и более сложные конструкции, например, фильтровать объединение двух множеств — присвоенного переменной nodes
и возвращаемого путем выборки body/*
:
($nodes|body/*)[self::a][@href]
Выражение, в котором производится фильтрация узлов, отвечает EBNF-правилу FilterExpr
:
[XP20] FilterExpr ::= PrimaryExpr | FilterExpr Predicate
Если раскрыть рекурсию, которая имеется в этом правиле, его можно переписать в более простом виде:
FilterExpr ::= PrimaryExpr Predicate*
Выражение PrimaryExpr
, которое используется в этой продукции, должно обязательным образом возвращать множество узлов. В противном случае процессор выдаст ошибку, потому что никакой другой тип не может быть преобразован во множество узлов.
Использование в выражениях путей выборки
Помимо того, что выражение само по себе может быть путем выборки, относительные пути можно комбинировать с другими выражениями. Например, можно выбрать все дочерние элементы узлов множества, содержащегося в переменной
$nodes/*
Для разделения шагов выборки в фильтрующих выражениях можно использовать операторы " /
" и " //
". Например, для того, чтобы получить всех потомков узлов из множества, присвоенного переменной, можно использовать выражение вида
$nodes//node()
Здесь node()
— это тест узла, выполняющийся для всех типов узлов, а //
, как и обычно, сокращение от /descendant-or-self:node()/
.
Выражения, которые используют пути выборки, соответствуют продукции PathExpr
:
[XP19] PathExpr ::= LocationPath
| FilterExpr
| FilterExpr '/' RelativeLocationPath
| FilterExpr '//' RelativeLocationPath
Объединение множеств
Множества могут быть объединены при помощи оператора " |
". В объединение будут входить узлы, которые присутствуют хотя бы в одном из множеств, причем результат не содержит повторений. Объединять можно любые выражения, результатом вычисления которых являются множества узлов.
Множество всех элементов а
, b
и с
документа может быть задано выражением //a|//b|//c
.
Выражению объединения соответствует продукция UnionExpr
:
[XP18] UnionExpr ::= PathExpr | UnionExpr '|' PathExpr
Старшинство операций
Теперь, когда мы изучили все типы операций XPath, можно дать синтаксическое определение выражению и выстроить все операции в порядке старшинства.
Выражению, как самой общей конструкции XPath, соответствует продукция Expr
, которая определяется следующим образом:
[XP14] Expr ::= OrExpr
То есть, фактически, выражение в XPath определяется через логическое выражение. Естественно, выражения не обязаны быть логическими. Просто в иерархии синтаксических правил логическое выражение "или" находится выше всего. Верхние правила определяются через более примитивные правила и так далее. В итоге иерархия выражений выстраивается следующим образом (в скобках приведены названия EBNF-правил):
□ выражения ( Expr
);
□ логические выражения "или" ( OrExpr
);
□ логические выражения "и" ( AndExpr
);
□ выражения равенства и неравенства ( EqualityExpr
);
□ выражения сравнения ( RelationalExpr
);
□ выражения сложения и вычитания ( AdditiveExpr
);
□ выражения умножения и деления ( MultiplicativeExpr
);
□ унарные выражения ( UnaryExpr
);
□ выражения объединения множеств ( UnionExpr
);
□ выражения путей выборки ( PathExpr
);
□ пути выборки ( LocationPath
), фильтрация множеств ( FilterExpr
), относительные пути выборки ( RelativeLocationPath
).
По этой схеме несложно выяснить старшинство операций — чем ниже выражение находится в этой иерархии, тем выше его приоритет. Для полной ясности, перечислим операции в порядке старшинства от старших, с большим приоритетом, к младшим, с меньшим приоритетом выполнения:
□ операции с путями выборки;
□ операция объединения множеств ( |
);
□ унарная операция отрицания ( -
);
□ умножение, деление и вычисление остатка от деления ( *
, div
и mod
);
□ операции сложения и вычитания ( +
и -
);
□ операции сравнения ( <
, >
, <=
, =>
);
□ операции проверки равенства и неравенства ( =
и !=
);
□ операция "и" ( and
);
□ операция "или" ( or
).
Операции одного порядка имеют левую ассоциативность, как это было показано на примере с операциями сравнения ( 3 > 2 > 1
равносильно (3 > 2) >1
).
Функции
Кроме операций, которые обеспечивают примитивные базовые действия, в XPath можно использовать функции. Спецификация языка XPath определяет базовую библиотеку функций , которую должны поддерживать все XSLT-процессоры. В XSLT эта библиотека дополняется еще несколькими полезными функциями. Кроме этого, большинство процессоров реализуют механизм расширений, при помощи которого можно использовать в XSLT собственные функции.
Читать дальшеИнтервал:
Закладка: