- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания Технология XSLT - Алексей Валиков
Шрифт:
Интервал:
Закладка:
Эти шаги соответствуют продукции StepPattern, которая отличается от продукции Step только тем, что разрешает использовать только оси child и attribute.
[PT5] StepPattern ::= ChildOrAttributeAxisSpecifier NodeTest
Predicate*
Продукция ChildOrAxisSpecifier описывает дескрипторы осей child и attribute в полном или сокращенном виде:
[P6] ChildOrAttributeAxisSpecifier
::= AbbreviatedAxisSpecifier
| ('child' | 'attribute') '::'
Для простоты мы можем раскрыть эту продукцию, получив ее в следующем виде:
ChildOrAttributeAxisSpecifier
::= '@' ?
| 'child::'
| 'attribute::'
Тогда продукцию StepPattern тоже можно переписать:
StepPattern ::= NodeTest Predicate*
| '@' NodeTest Predicate*
| 'child::' NodeTest Predicate*
| 'attribute::' NodeTest Predicate*
Теперь стало совершенно очевидно, что шаг паттерна это не что иное, как подмножество шагов выборки, в которых ограничено множество осей навигации.
Таким образом, синтаксически паттерны отличаются от путей выборки тем, что в них можно использовать только две оси навигации (не считая descendant-or-self в виде оператора), но зато можно в качестве узла отсчета использовать узел, выбранный по своему уникальному атрибуту или по значению ключа.
Паттерны могут использоваться в XSLT в следующих атрибутах:
□ атрибуты count и from элемента xsl:number;
□ атрибут match элемента xsl:key;
□ атрибут match элемента xsl:template.
Последние два случая паттернов отличаются от первого тем, что в них нельзя использовать переменные. Определение вида
<xsl:template match="*[name() = $name]">
...
</xsl:template>
будет некорректным.
Семантика паттернов
Остановимся подробнее на вопросе — что же означает "соответствие узла некоторому паттерну".
Прежде всего, заметим, что любой паттерн является также и XPath-выражением. Тогда строгое определение соответствия узла паттерну можно дать следующим образом.
Узел X соответствует паттерну P тогда и только тогда, когда существует такой узел Y, принадлежащий оси ancestor-or-self узла X, что множество, получаемое в результате вычисления выражения P в контексте узла Y будет содержать узел X.
ПримерРассмотрим это определение на примере паттерна body//а. Строго говоря, узел будет соответствовать этому паттерну, если во множестве его предков (плюс сам узел) найдется такой узел, что множество body//а, вычисленное в его контексте, будет содержать проверяемый узел. На практике первые два элемента а приведенного ниже документа соответствуют этому паттерну, потому что существует элемент html, содержащий элемент body, потомками которого эти элементы а являются.
Листинг 6.2<html>
<body>
<a>
<!-- Соответствует паттерну body//a -->
</a>
<p>
<a>
<!-- Соответствует паттерну body//a -->
</a>
</p>
</body>
<а>
<!-- Не соответствует паттерну body//а -->
</а>
</html>
Существует также и более простое определение соответствия. Узел X соответствует паттерну P тогда и только тогда, когда X принадлежит множеству //P. В приведенном выше примере паттерну body//а соответствуют все узлы множества //body//а.
Эти определения эквивалентны. На практике следует пользоваться тем, которое кажется более понятным.
Примеры паттернов
□ body — соответствует элементам body с нулевым пространством имен;
□ xhtml:body — соответствует элементам body, принадлежащим пространству имен с префиксом xhtml;
□ body/a — соответствует дочерним элементам а элемента body;
□ * — соответствует любому элементу, который принадлежит нулевому пространству имен;
□ а[1] — соответствует каждому первому элементу а своего родительского узла; элемент будет соответствовать этому паттерну, если ему не предшествует никакой братский элемент a — то есть из всех дочерних элементов а некоторого узла этому паттерну будет соответствовать только первый в порядке просмотра документа элемент;
□ a[position() mod 2 = 0] — соответствует каждому четному элементу a своего родительского узла; иначе говоря, из всех элементов а некоторого узла этому паттерну будут соответствовать только четные;
□ / — соответствует корневому узлу;
□ /html — узел будет соответствовать этому паттерну тогда и только тогда, когда он является элементом с именем html и нулевым пространством имен и находится при этом в корне элемента;
□ //html — соответствует любому элементу html документа, принадлежащему нулевому пространству имен; этот паттерн равносилен паттерну html;
□ *[starts-with(local-name(), 'A') or starts-with(local-name(), 'a')] — соответствует любому элементу, имя которого начинается на букву "а" в любом регистре символов;
□ *[string-length(local-name())=2] — соответствует любому элементу, локальная часть имени которого состоит из двух символов;
□ *[starts-with(namespace-uri(),'http') or starts-with(namespace-uri(), 'HTTP')] — соответствует любому элементу, URI пространства имен которого начинается на "http" или "HTTP";
□ br[not(*)] — соответствует элементу br, который не имеет дочерних элементов;
□ id('i') — соответствует элементу, уникальный атрибут которого (атрибут, имеющий тип ID) равен "i";
□ id('i')/@id — соответствует атрибуту id элемента, уникальный атрибут которого равен "i"; заметим, что уникальный атрибут элемента вовсе не обязательно должен иметь имя id;
□ key('name', 'html')/@href — соответствует атрибуту href узла, значение ключа с именем "name" которого равно "html";
□ *|@* — соответствует любому элементу или атрибуту;
□ a|b|с — соответствует элементам а, b и с;
□ node() — соответствует любому узлу, кроме узла атрибута и пространства имен (поскольку они не являются дочерними узлами своих родителей);
□ node() | attribute::* | namespace::* — соответствует любому узлу, включая узлы атрибутов и пространств имен;
□ node()[not(self::text())] — соответствует любому узлу, кроме текстового узла, узла атрибута и узла пространства имен.
Выражения
Выражения XPath являются наиболее общими конструкциями этого языка. Пути выборки, разобранные ранее, — это всего лишь частный случай выражения. Выражения включают в себя арифметические и логические операции, вызов функций, операции с путями выборки и так далее.
Выражениям языка соответствует нетерминал Expr. И хотя синтаксическое правило, определяющее этот нетерминал, записывается очень просто, в данный момент оно нам абсолютно ничего не скажет.
Базовая конструкция, использующаяся в выражениях, называется первичным выражением (от англ. primary expression). Первичные выражения могут быть переменными, литералами, числами, вызовами функций, а также обычными выражениями Expr, сгруппированными в круглых скобках:
[XP15] PrimaryExpr ::= VariableReference
| '(' Expr ')'
| Literal
| Number
| FunctionCall
Переменные
Переменные вызываются в выражениях XPath по своему имени, которому предшествует символ "$". Например, если мы объявили переменную nodes:
<xsl:variable name="nodes" select="a/b"/>
то использовать в выражениях мы ее будем как $nodes.
Переменные, так же как элементы и атрибуты XML, могут иметь расширенные имена вида QName, состоящие из префикса пространства имен и локальной части имени. Это позволяет создавать переменные, принадлежащие различным пространствам имен.
ПримерМы можем определить две переменные с одинаковыми локальными частями имен в разных пространствах, используя при определении имени префикс. Естественно, префикс должен быть заранее связан с URI пространства имен.
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="uri:a"