- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания XSLT - Стивен Холзнер
Шрифт:
Интервал:
Закладка:
<xsl:template match="PLANET">
<TR>
<TD><xsl:apply-templates select="NAME"/></TD>
<TD><xsl:apply-templates select="MASS"/></TD>
<TD><xsl:apply-templates select="RADIUS"/></TD>
<TD><xsl:apply-templates select="DAY"/></TD>
</TR>
</xsl:template>
<xsl:template match="NAME | MASS">
<xsl:if test="self::NAME">
<xsl:value-of select="."/>
</xsl:if>
<xsl:if test="self::MASS">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
<xsl:value-of select="@UNITS"/>
</xsl:if>
</xsl:template>
.
.
.
На этом мы завершаем рассмотрение новых осей XPath. Давайте перейдем к примерам.
Примеры путей расположения
Мы изучили достаточно теории путей расположения. Но, понятно, лучше всего осваивать этот материал на примерах, поэтому я привожу следующий список примеров путей расположения (сокращенные варианты рассматриваются после этого списка):
• child::PLANЕТ. Возвращает дочерние элементы <PLANЕТ> контекстного узла;
• child::text(). Возвращает все дочерние текстовые узлы контекстного узла;
• child::node(). Возвращает всех детей контекстного узла;
• attribute::UNIT. Возвращает атрибут UNIT контекстного узла;
• descendant::PLANET. Возвращает все элементы-потомки <PLANET> контекстного узла;
• ancestor::PLANET. Возвращает всех предков <PLANET> контекстного узла;
• ancestor-or-self::PLANET. Возвращает предков <PLANET> контекстного узла. Если контекстным узлом тоже является <PLANET>, возвращает также контекстный узел;
• descendant-or-self::PLANET. Возвращает элементы-потомки <PLANET> контекстного узла. Если контекстным узлом тоже является <PLANET>, возвращает также контекстный узел;
• self::PLANET. Возвращает контекстный узел, если им является элемент <PLANET>;
• child::PLANET/descendant::NAME. Возвращает элементы-потомки <NAME> дочерних элементов <PLANET> контекстного узла;
• child::*/child::PLANET. Возвращает всех внуков <PLANET> контекстного узла;
• /. Возвращает корневой узел;
• /descendant::PLANET. Возвращает все элементы <PLANET> в документе;
• /descendant::PLANET/child::NAME. Возвращает все элементы <NAME> с родителем <PLANET> в документе;
• child::PLANET[position()=3]. Возвращает третьего ребенка <PLANET> контекстного узла;
• child::PLANET[position()=last()]. Возвращает последнего ребенка <PLANET> контекстного узла;
• /descendant::PLANET[position() = 3]. Возвращает третий элемент <PLANET> в документе;
• child::PLANETS/child::PLANET[position()=4]/child::NAME[position()=3]. Возвращает третий элемент <NAME> четвертого элемента <PLANET> элемента <PLANETS>;
• child::PLANET[position()>3]. Возвращает всех детей <PLANET> контекстного узла после первых трех;
• preceding-sibling::NAME[position()=2]. Возвращает второй предыдущий элемент-брат <NAME> контекстного узла;
• child::*[self::NAME or self::MASS]. Возвращает детей <NAME> и <MASS> контекстного узла.
• child::*[self::NAME or self::MASS][position()=last()]. Возвращает последнего ребенка <NAME> или <MASS> контекстного узла.
Как видите, синтаксис некоторых выражений достаточно запутан, и набирать их также довольно долго. Но, как и для образцов, существует сокращенная форма синтаксиса XPath.
Сокращенный синтаксис XPath
Сокращения синтаксиса XPath могут быть весьма удобными. Ниже приведены правила:
• self::node() может быть сокращено как .;
• parent::node() может быть сокращено как ..;
• child::childname может быть сокращено как childname;
• attribute::childname может быть сокращено как @childname;
• /descendant-or-self::node()/ может быть сокращено как //.
Например, путь расположения .//PLANET — сокращение для self::node()/descendant-or-self::node()/child::PLANET. Можно также сократить выражение предиката [position()=3] как [3], [position()=last()] как [last()] и т.д. Работать с путями расположения XPath при помощи сокращенного синтаксиса значительно проще. В следующем списке перечислен ряд примеров путей расположения с использованием сокращенного синтаксиса:
• PLANET возвращает дочерние элементы <PLANET> контекстного узла;
• * возвращает все дочерние элементы контекстного узла;
• text() возвращает все дочерние текстовые узлы контекстного узла;
• @UNITS возвращает атрибут UNITS контекстного узла;
• @* возвращает все атрибуты контекстного узла;
• PLANET[3] возвращает третьего ребенка <PLANET> контекстного узла;
• PLANET[last()] возвращает последнего ребенка <PLANET> контекстного узла;
• */PLANET возвращает всех внуков <PLANET> контекстного узла;
• /PLANETS/PLANET[3]/NAME[2] возвращает второй элемент <NAME> третьего элемента <PLANET> элемента <PLANETS>;
• //PLANET возвращает всех потомков <PLANET> корня документа;
• PLANETS//PLANET возвращает элементы-потомки <PLANET> дочерних элементов <PLANETS> контекстного узла;
• //PLANET/NAME возвращает все элементы <NAME>, у которых есть родитель <PLANET>;
• . возвращает сам контекстный узел;
• .//PLANET возвращает элементы-потомки <PLANET> контекстного узла;
• .. возвращает родителя контекстного узла;
• ../@UNITS возвращает атрибут UNITS родителя контекстного узла;
• .//.. возвращает всех родителей потомка контекстного узла и родителя контекстного узла;
• PLANET[NAME] возвращает детей <PLANET> контекстного узла, у которых есть дети <NAME>;
• PLANET[NAME="Venus"] возвращает детей <PLANET> контекстного узла, у которых есть дети <NAME> с текстом, равным «Venus»;
• PLANET[@UNITS="days"] возвращает всех детей <PLANET> контекстного узла, у которых есть атрибут UNITS со значением «days»;
• PLANET[6][@UNITS="days"] возвращает шестого ребенка <PLANET> контекстного узла, только если у этого ребенка есть атрибут UNITS со значением «days». Можно также написать PLANET[@UNITS="days"][6];
• PLANET[@COLOR and @UNITS] возвращает всех детей <PLANET> контекстного узла, у которых есть атрибут COLOR и атрибут UNITS;
• "//PLANET[not(.=preceding::PLANET)]" выбирает все элементы <PLANET>, значение которых отлично от значения любого предшествующего элемента <PLANET>;
• *[1][self::NAME] выбирает любой элемент <NAME>, который является первым ребенком своего родителя;
• *[position() < 5][@UNITS] выбирает первых пятерых детей контекстного узла, у которых есть атрибут UNITS.
Проверка выражений XPath
В пакет Xalan входит удобная программа-пример, ApplyXPath.java, позволяющая применить выражение XPath к документу и посмотреть на результат, что очень помогает при тестировании. Для запуска этого примера вам нужно будет скомпилировать ApplyXPath.java в ApplyXPath.class при помощи утилиты java.exe, входящей в поставку Java.
В качестве примера я применю выражение XPath «PLANET/NAME» к planets.xml при помощи ApplyXPath.class. Ниже показан результат, отображающий все элементы <NAME>, дочерние по отношению к элементам <PLANET> (теги <output> добавлены программой ApplyXPath):
%java ApplyXPath planets.xml PLANET/NAME
<output>
<NAME>Mercury</NAME><NAME>Venus</NAME><NAME>Earth</NAME>
</output>
XPath 2.0
XPath находится в стадии обновления, и в него включаются средства поддержки XSLT 2.0 (см. www.w3.org/TR/xpath20req). Задачи XPath 2.0 следующие:
• упрощение операций с содержимым типов, поддерживаемых схемой XML;
• упрощение операций со строковым содержимым;
• поддержка соответствующих стандартов XML;
• улучшение удобства использования;
• улучшение функциональной совместимости;
• улучшение поддержки международных языковых средств;
• сохранение обратной совместимости;
• повышенная эффективность процессора.
Следующий список дает обзор требований XPath. Главные пункты — поддержка схемы XML и регулярных выражений, что дает средства работы со строками и поиска в строках. (Дополнительную информацию о регулярных выражениях можно почерпнуть по адресу http://www.perldoc.com/perl5.6/pod/perlre.html.) В соответствии с W3C, XPath 2.0:
• должен поддерживать архитектуру XML W3C, хорошо взаимодействуя с другими стандартами в семействе XML;