Выбрать главу

  <xsclass="underline" message terminate="yes">

   Each planet must have a name!

  </xsclass="underline" message>

 </xsclass="underline" if>

 <xsclass="underline" value-of select="NAME"/>

  <xsclass="underline" choose>

   <xsclass="underline" when test="position()!=last()">, </xsclass="underline" when>

   <xsclass="underline" when test="position()=last()-1">and </xsclass="underline" when>

   <xsclass="underline" otherwise>.</xsclass="underline" otherwise>

  </xsclass="underline" choose>

</xsclass="underline" template>

Кроме того, имеется функция true, всегда возвращающая истину, и функция false, всегда возвращающая ложь. Есть также функция lang, при помощи которой вы можете проверить язык, установленный в атрибуте документа xmclass="underline" lang: эта функция возвращает истину, если язык, который вы передали в эту функцию, такой же, как и установленный в документе язык.

Как вы видели, существуют все виды выражений XPath, в том числе возвращающие узлы, числа, строки и логические значения. Наиболее важным типом выражений XPath является путь расположения; для создания путей расположена XPath первоначально и задумывался, поэтому оставшаяся часть главы будет посвящена работе с ними.

Создание путей расположения XPath

Вы уже знакомы со взглядом на документы с позиции XPath; например, в XPath определено семь типов узлов документа:

• Корневой узел. Самое начало документа. Этот узел представляет в XPath весь документ;

• Узлы элементов. Представляют элементы в деревьях XPath, обозначенные открывающим и соответственным закрывающим тегами или единственным пустым тегом элемента;

• Узлы атрибутов. Значение атрибута после раскрытия ссылок на сущность и отбрасывания окружающих символов-разделителей;

• Узлы комментариев. Текст комментариев, не включая <!-- и -->;

• Узлы пространств имен. Объявление пространства имен. В 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 содержит всех предшествующих «братьев» контекстного узла;