• Узлы комментариев. Текст комментариев, не включая
<!--
и
– ->
;
• Узлы пространств имен. Объявление пространства имен. В 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
, который выбирает все элементы
<NAME>
с родителем
<PLANET>
.
Шаги XPath похожи на образцы шага из главы 4, так как общий их вид одинаков —
axis::nodetest[predicate]
— но в данном случае нужно рассмотреть значительно больше материала. Например, осей теперь тринадцать, а не две.
Шаги расположения XPath, часть 1: оси
В пути расположения
ancestor::NAME
, адресующем элемент
<NAME>
, который является предком контекстного узла,
ancestor
выступает осью. XPath поддерживает много различных осей, ниже приведен полный список:
• ось
ancestor
содержит предков (ancestor) контекстного узла, то есть родителей контекстного узла, родителей этих родителей и т.д., вплоть до корневого узла (включая его);
• ось
ancestor-or-self
содержит контекстный узел и его предков;
• ось
attribute
содержит атрибуты контекстного узла;
• ось
child
содержит детей контекстного узла;
• ось
descendant
содержит потомков (descendant) контекстного узла, то есть его детей, детей этих детей и т.д.;
• ось
descendant-or-self
содержит контекстный узел и его потомков;
• ось
following
содержит все узлы в том же документе, такие же, как контекстный узел, встретившиеся после контекстного узла;
• ось
following-sibling
содержит всех последующих братьев контекстного узла. «Брат» — узел, расположенный на том же уровне, что и контекстный узел;
• ось
namespace
содержит узлы пространств имен контекстного узла;
• ось
parent
содержит родителя контекстного узла;
• ось
preceding
содержит все узлы до контекстного узла;
• ось
preceding-sibling
содержит всех предшествующих «братьев» контекстного узла;
• ось
self
содержит контекстный узел.
В следующем примере шаблона я воспользовался осью
descendant
для выбора потомков контекстного узла, куда входят дочерние узлы, узлы-внуки, узлы-правнуки и т.д.:
<xsl:template match="PLANET">
<DATA>
<NAME>
<xsl:value-of select="descendant::NAME"/>
</NAME>
<MASS>
<xsl:value-of select="descendant::MASS"/>
</MASS>
<DAY>
<xsl:value-of select="descendant::DAY"/>
</DAY>
</DATA>
</xsl:template>
В этой главе мы рассмотрим все перечисленные оси. В данном примере осью является
descendant
, а имена элементов
NAME
,
MASS
и
DAY
— это условия узлов.
Шаги расположения XPath, часть 2: условия узлов
При создании образцов в качестве условий узлов (node test) можно использовать имена узлов или символ подстановки * для выбора любого узла элемента. Например, выражение
child::*/child::NAME
выбирает все элементы
<NAME>
, являющиеся правнуками контекстного узла. В XPath кроме имен и символа подстановки можно также применять, как и в образцах выбора, следующие условия узлов:
• условие узла
comment
выбирает узлы комментария;
• условие узла
node
выбирает узел любого типа;
• условие узла
processing-instruction
выбирает узел инструкции обработки. В скобках можно указать название выбираемой инструкции обработки;
• условие узла
text
выбирает текстовый узел
Например, в листинге 7.2 таблица стилей находит в документе все комментарии при помощи условия узла