означает «меньше, чем» (в документах XML используйте
<
);
•
<=
означает «меньше или равно» (в документах XML используйте
<=
);
•
=
означает «равно» (программисты на С, С++, Java и JavaScript, обратите внимание: эта операция пишется как один знак =, а не два);
•
>
означает «больше, чем»;
•
>=
означает «больше или равно».
Для связи логических выражений логическими операциями And и Or используются ключевые слова
and
и
or
, слово
not
инвертирует логический смысл выражения, как в следующем примере, где я выбираю все элементы
<PLANET>
, кроме первого и последнего:
<xsl:template match="PLANET[not(position = 1) and not(position = last)]">
<xsl:value-of select="."/>
</xsl:template>
Следующий пример уже встречался нам в главе 5, он использует логическую операцию
not
и операции
=
и
!=
:
<xsl:template match="PLANET">
<xsl:if test="NAME[not(text)]">
<xsl:message terminate="yes">
Each planet must have a name!
</xsl:message>
</xsl:if>
<xsl:value-of select="NAME"/>
<xsl:choose>
<xsl:when test="position!=last">, </xsl:when>
<xsl:when test="position=last-1">and </xsl:when>
<xsl:otherwise>.</xsl:otherwise>
</xsl:choose>
</xsl:template>
Кроме того, имеется функция
true
, всегда возвращающая истину, и функция
false
, всегда возвращающая ложь. Есть также функция
lang
, при помощи которой вы можете проверить язык, установленный в атрибуте документа
xml: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
содержит всех предшествующих «братьев» контекстного узла;
• ось
self
содержит контекстный узел.
В следующем примере шаблона я воспользовался осью
descendant
для выбора потомков контекстного узла, куда входят дочерние узлы, узлы-внуки, узлы-правнуки и т.д.: