Рис. 6.4.Применение режимов обработки
Режимы также очень удобны в том случае, когда требуется обработать один и тот же документ более одного раза; классический пример — создание оглавления.
Следующий пример демонстрирует создание оглавления. Я добавил в planets.xml
оглавление в элементе (table of contents, оглавление), имеющем три элемента для каждой из планет. Заметьте, что здесь мне необходимо применить два шаблона, выбирающие элементы , — один для создания оглавления и еще один для копирования всех элементов в результирующий документ — я использую режимы для того, чтобы их различать. Начну с установки режима в « toc
» и применения шаблона, который поддерживает этот режим и создает оглавление:
xmlns:xsl="http//www.w3.org/1999/XSL/Transform">
.
.
.
.
.
.
Затем я применяю общий шаблон без каких-либо режимов обработки ко всем элементам и атрибутам, копируя их в результирующий документ (листинг 6.14).
Листинг 6.14. Создание оглавления
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
И, наконец, результат, выводящий planets.xml
с оглавлением:
Mercury
Venus
Earth
Mercury
.0553
58.65
1516
.983
43.4
;
• Узлы пространств имен. Объявление пространства имен. В XPath узел пространства имен добавляется во все элементы для каждого активного пространства имен, включая пространства имен по умолчанию;
• Узлы инструкций обработки. Содержат текст инструкции обработки, не включая ;
• Текстовые узлы. Текст PCDATA. Текстовые узлы по умолчанию в XPath нормализованы, поэтому расположенные рядом текстовые узлы немедленно объединяются.
Для задания узла или набора узлов в XPath служит путь расположения (location path). Путь расположения, в свою очередь, состоит из одного или более шагов расположения (location step), также называемых просто шагами, разделенных / или //. Если путь расположения начинается с /, он называется абсолютным путем расположения, поскольку путь задается от корневого узла; иначе путь называется относительным, начинаясь от контекстного узла.
Шаги расположения, строительные блоки путей расположения, во многом похожи на образцы шага (step patterns), формирующие образцы выбора, которые мы видели в главе 4. В частности, шаг расположения образован из оси (axis), условия узла (node test) и предикатов (которых может и не быть) по такому образцу: axis::nodetest[predicate]
. Например, в выражении ancestor::NAME[position() > 100]
, ancestor
— это имя оси, NAME
— условие узла и [position() >100]
— предикат. (Предикат сам содержит законченное выражение XPath, обычно возвращающее логическое значение.) Пути расположения создаются при помощи одного или более шагов расположения, таких как /descendant::PLANET/child::NAME
, который выбирает все элементы с родителем .
Шаги XPath похожи на образцы шага из главы 4, так как общий их вид одинаков — axis::nodetest[predicate]
— но в данном случае нужно рассмотреть значительно больше материала. Например, осей теперь тринадцать, а не две.
Шаги расположения XPath, часть 1: оси
В пути расположения ancestor::NAME
, адресующем элемент , который является предком контекстного узла, ancestor
выступает осью. XPath поддерживает много различных осей, ниже приведен полный список:
• ось ancestor
содержит предков (ancestor) контекстного узла, то есть родителей контекстного узла, родителей этих родителей и т.д., вплоть до корневого узла (включая его);
• ось ancestor-or-self
содержит контекстный узел и его предков;
• ось attribute
содержит атрибуты контекстного узла;
• ось child
содержит детей контекстного узла;
• ось descendant
содержит потомков (descendant) контекстного узла, то есть его детей, детей этих детей и т.д.;
• ось descendant-or-self
содержит контекстный узел и его потомков;
• ось following
содержит все узлы в том же документе, такие же, как контекстный узел, встретившиеся после контекстного узла;
• ось following-sibling
содержит всех последующих братьев контекстного узла. «Брат» — узел, расположенный на том же уровне, что и контекстный узел;
• ось namespace
содержит узлы пространств имен контекстного узла;
• ось parent
содержит родителя контекстного узла;
Читать дальше