<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=XPath</id>
	<title>XPath - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=XPath"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=XPath&amp;action=history"/>
	<updated>2026-07-16T16:26:45Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=XPath&amp;diff=11118&amp;oldid=prev</id>
		<title>imported&gt;Alex NB OT: унификация языковых шаблонов</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=XPath&amp;diff=11118&amp;oldid=prev"/>
		<updated>2025-11-15T11:07:34Z</updated>

		<summary type="html">&lt;p&gt;унификация языковых шаблонов&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Технологический стандарт}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;XPath&amp;#039;&amp;#039;&amp;#039; (XML Path Language) — язык запросов к элементам [[XML]]-документа. Разработан для организации доступа к частям документа XML в файлах трансформации [[XSLT]] и является стандартом консорциума [[W3C]].&lt;br /&gt;
XPath призван реализовать навигацию по [[Document Object Model|DOM]] в [[XML]].&lt;br /&gt;
В XPath используется компактный синтаксис, отличный от принятого в XML.&lt;br /&gt;
В 2007 году завершилась разработка версии 2.0, которая теперь является составной частью языка [[XQuery]] 1.0.&lt;br /&gt;
В декабре 2009 года началась разработка версии 2.1, которая использует XQuery 1.1.&lt;br /&gt;
&lt;br /&gt;
На данный момент самой популярной версией является XPath 1.0. Это связано с отсутствием поддержки XPath 2.0 со стороны открытых библиотек. В частности, речь идёт о [[libxml2]], от которой зависит поддержка языка в браузерах, с одной стороны, и поддержка со стороны серверного интерпретатора, с другой.&lt;br /&gt;
&lt;br /&gt;
== Основы ==&lt;br /&gt;
У XML древовидная структура. В отдельном XML-документе есть один корневой элемент (инструкция &amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt; к дереву элементов не относится), в котором допускается ряд вложенных элементов, некоторые из которых тоже могут содержать вложенные элементы. Также встречаются текстовые узлы, комментарии и инструкции. Можно считать, что XML-элемент содержит массив вложенных в него элементов и массив атрибутов.&lt;br /&gt;
&lt;br /&gt;
У элементов дерева бывают элементы-предки и элементы-потомки (у корневого элемента предков нет, а у тупиковых элементов (листьев дерева) нет потомков). Каждый элемент дерева находится на определённом уровне вложенности (далее — «уровень»). Элементы упорядочены в порядке расположения в тексте XML, и поэтому можно говорить об их предыдущих и следующих элементах. Это очень похоже на организацию каталогов в файловой системе.&lt;br /&gt;
&lt;br /&gt;
Строка XPath описывает способ выбора нужных элементов из массива элементов, которые могут содержать вложенные элементы. Начинается отбор с переданного множества элементов, на каждом шаге пути отбираются элементы, соответствующие выражению шага, и в результате оказывается отобрано подмножество элементов, соответствующих данному пути.&lt;br /&gt;
&lt;br /&gt;
Для примера возьмём следующий [[XHTML]]-документ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;html4strict&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;html&amp;gt;&lt;br /&gt;
 &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;Первый слой&lt;br /&gt;
      &amp;lt;span&amp;gt;блок текста в первом слое&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;Второй слой&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div&amp;gt;Третий слой&lt;br /&gt;
      &amp;lt;span class=&amp;quot;text&amp;quot;&amp;gt;первый блок в третьем слое&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;span class=&amp;quot;text&amp;quot;&amp;gt;второй блок в третьем слое&amp;lt;/span&amp;gt;&lt;br /&gt;
      &amp;lt;span&amp;gt;третий блок в третьем слое&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;span&amp;gt;четвёртый слой&amp;lt;/span&amp;gt;&lt;br /&gt;
    &amp;lt;img /&amp;gt;&lt;br /&gt;
 &amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
XPath-путь &amp;#039;&amp;#039;&amp;#039;/html/body/*/span[@class]&amp;#039;&amp;#039;&amp;#039; будет соответствовать в нём двум элементам исходного документа — &amp;lt;code&amp;gt;&amp;amp;lt;span class=&amp;quot;text&amp;quot;&amp;amp;gt;первый блок в третьем слое&amp;amp;lt;/span&amp;amp;gt;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;&amp;amp;lt;span class=&amp;quot;text&amp;quot;&amp;amp;gt;второй блок в третьем слое&amp;amp;lt;/span&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Элементы пути преимущественно пишутся в XPath в краткой форме. Полная форма приведённого выше пути имеет вид &amp;#039;&amp;#039;&amp;#039;/child::html/child::body/child::*/child::span[attribute::class]&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Путь состоит из &amp;#039;&amp;#039;шагов адресации,&amp;#039;&amp;#039; которые разделяются символом «косая черта» &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Каждый шаг адресации состоит из трёх частей:&lt;br /&gt;
* ось (по умолчанию child::, ось элементов). Кроме отбора по оси вложенных элементов, можно отбирать по другим осям элементов и по оси атрибутов (attribute::, она же обозначается символом &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;) (см. ниже).&lt;br /&gt;
* выражение, определяющее отбираемые элементы (в примере отбор делается по соответствию элементов документа именам html, body, span, и используется символ &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, который отберёт все элементы оси)&lt;br /&gt;
* предикаты (в данном примере это attribute::class) — дополнительные условия отбора. Их может быть несколько. Каждый предикат заключается в квадратные скобки и подразумевает логическое выражение для проверки отбираемых элементов. Если предиката нет, то отбираются все подходящие элементы.&lt;br /&gt;
&lt;br /&gt;
Анализ пути ведётся слева направо и начинается либо в контексте первого элемента корневого узла (в данном примере это элемент html), и тогда по оси child:: будут вложенные в него элементы (в данном примере это один элемент body), что удобно в случае обработки обычного XML-документа с одним корневым узлом, либо, если в начале XPath указан символ &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt;, в контексте со всеми корневыми элементами переданного XML по оси child:: (в данном примере это будет один элемент html). На каждом шаге адресации в текущем контексте отбираются элементы, подходящие под указанные в шаге условия, и их перечень берётся как контекст для следующего шага или как возвращаемый результат.&lt;br /&gt;
&lt;br /&gt;
Таким образом, первый шаг &amp;lt;code&amp;gt;/child::html&amp;lt;/code&amp;gt; явным образом делает текущим контекстом для следующего шага перечень из одного элемента html, что было бы и так сделано неявно, если этот шаг не был обозначен.&lt;br /&gt;
&lt;br /&gt;
На втором шаге адресации в данном примере (шаг child::body) контекстом является перечень из одного элемента html. Ось child:: говорит о том, что необходимо смотреть на имена вложенных элементов в текущем контексте, а условие проверки body говорит о том, что в формируемый набор элементов нужно включить те узлы, у которых имя — body. Таким образом, в ходе второго шага адресации получаем набор узлов, состоящий всего из одного элемента body, который и становится контекстом для третьего шага.&lt;br /&gt;
&lt;br /&gt;
Третий шаг адресации: child::* . Ось child:: содержит все непосредственные потомки элемента body, а условие проверки * говорит о том, что в формируемый перечень нужно включить элементы основного типа с любым именем. В ходе этого шага получаем перечень, состоящий из трёх элементов div, одного span и одного элемента img — итого, пять элементов.&lt;br /&gt;
&lt;br /&gt;
Четвёртый шаг адресации: child::span/@class. Его контекстом является перечень из пяти элементов, поэтому исходящий перечень создаётся в пять проходов (за пять итераций). При первой итерации узлом контекста становится первый div. Согласно заданной оси child:: и правилу проверки span, в набор должны включаться непосредственные потомки этого div’а, имя которых равно span. Там такой один. При второй итерации в набор ничего добавляться не будет, так как у второго div нет потомков. Третья итерация увидит сразу три элемента span. Четвёртая ничего не увидит, так как у элемента span нет потомков span, а то, что он сам span — не важно, ведь просматриваются именно потомки. Пятая тоже ничего не увидит, у элемента img тоже нет потомков span. Итак, в ходе проверки мог бы быть получен набор узлов, состоящий из четырёх элементов span. Это и было бы контекстом для последующей обработки, не будь на этом шаге указано предиката.&lt;br /&gt;
&lt;br /&gt;
Но так как предикат на четвёртом шаге есть, по мере выполнения каждого из пяти проходов будет производиться дополнительная фильтрация отбираемых элементов. В данном случае у предиката ось attribute:: говорит о необходимости проверить, есть ли у отбираемого узла атрибуты, а условие class требует оставить лишь те узлы, у которых задан атрибут с именем class. И поэтому на первой итерации единственный найденный span фильтрацию предикатом не пройдёт, на третьей итерации фильтрацию пройдут два элемента из трёх, и в итоге, несмотря на то, что фильтрация происходит за пять итераций, в окончательный набор попадают только два элемента span.&lt;br /&gt;
&lt;br /&gt;
== Оси ==&lt;br /&gt;
Оси — это &amp;#039;&amp;#039;база&amp;#039;&amp;#039; языка XPath. Для некоторых осей существуют сокращённые обозначения.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;child::&amp;#039;&amp;#039;&amp;#039; — содержит множество элементов-потомков (элементов, расположенных на один уровень ниже). Это название сокращается полностью, то есть его можно вовсе опускать.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;descendant::&amp;#039;&amp;#039;&amp;#039; — содержит полное множество элементов-потомков (то есть, как ближайших элементов-потомков, так и всех их элементов-потомков). Выражение &amp;lt;code&amp;gt;/descendant::node()/&amp;lt;/code&amp;gt; можно сокращать до &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;descendant-or-self::&amp;#039;&amp;#039;&amp;#039; — содержит полное множество элементов-потомков и текущий элемент. С помощью этой оси, например, можно вторым шагом организовать отбор элементов с любого узла, а не только с корневого: достаточно первым шагом взять всех потомков корневого. Например, путь &amp;lt;code&amp;gt;//span&amp;lt;/code&amp;gt; отберёт все узлы &amp;lt;code&amp;gt;span&amp;lt;/code&amp;gt; документа, независимо от их положения в иерархии, взглянув как на имя корневого, так и на имена всех его дочерних элементов, на всю глубину их вложенности.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ancestor::&amp;#039;&amp;#039;&amp;#039; — содержит множество элементов-предков.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;ancestor-or-self::&amp;#039;&amp;#039;&amp;#039; — содержит множество элементов-предков и текущий элемент.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;parent::&amp;#039;&amp;#039;&amp;#039; — содержит элемент-предок на один уровень назад. Это обращение можно заменить на &amp;lt;code&amp;gt;..&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;self::&amp;#039;&amp;#039;&amp;#039; — содержит текущий элемент. Это обращение можно заменить на &amp;lt;code&amp;gt;.&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;following::&amp;#039;&amp;#039;&amp;#039; — содержит множество элементов, расположенных ниже текущего элемента по дереву (на всех уровнях и слоях), исключая собственных потомков.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;following-sibling::&amp;#039;&amp;#039;&amp;#039; — содержит множество братских элементов того же уровня, следующих за текущим слоем.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;preceding::&amp;#039;&amp;#039;&amp;#039; — содержит множество элементов, расположенных выше текущего элемента по дереву (на всех уровнях и слоях), исключая множество собственных предков.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;preceding-sibling::&amp;#039;&amp;#039;&amp;#039; — содержит множество братских элементов того же уровня, предшествующих текущему слою.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;attribute::&amp;#039;&amp;#039;&amp;#039; — содержит множество атрибутов текущего элемента. Это обращение можно заменить на символ &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;namespace::&amp;#039;&amp;#039;&amp;#039; — содержит множество элементов, относящихся к тому или иному пространству имён (то есть присутствует атрибут &amp;lt;code&amp;gt;xmlns&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== Выражение, определяющее отбираемые элементы ==&lt;br /&gt;
В рамках содержимого &amp;#039;&amp;#039;оси&amp;#039;&amp;#039; отбор выполняется согласно выражению, определяющему отбираемые элементы.&lt;br /&gt;
&lt;br /&gt;
В качестве выражения может быть&lt;br /&gt;
* указано конкретное имя, тогда отбираются элементы оси, соответствующие этому имени&lt;br /&gt;
* указан символ &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, что отберёт все элементы оси&lt;br /&gt;
* указано выражение, составленное из функций, и тогда будут отобраны результаты вычисления выражения в контексте каждого элемента оси&lt;br /&gt;
&lt;br /&gt;
Функции делятся на 5 групп:&lt;br /&gt;
&lt;br /&gt;
=== Функции над множествами узлов ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Функция&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Описание&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;node&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;node-set &amp;#039;&amp;#039;&amp;#039;node&amp;#039;&amp;#039;&amp;#039;()&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает сам узел. Вместо этой функции часто используют заменитель &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;, но, в отличие от звёздочки, функция &amp;lt;code&amp;gt;node()&amp;lt;/code&amp;gt; возвращает и &amp;#039;&amp;#039;текстовые&amp;#039;&amp;#039; узлы&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;text&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;text&amp;#039;&amp;#039;&amp;#039;()&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает узел, если он текстовый&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;current&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;node-set &amp;#039;&amp;#039;&amp;#039;current&amp;#039;&amp;#039;&amp;#039;()&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с предикатами, то единственным способом дотянуться из этого предиката до текущего элемента будет данная функция&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;position&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;position&amp;#039;&amp;#039;&amp;#039;()&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает позицию элемента в множестве элементов оси. Корректно работает только в цикле &amp;lt;code&amp;gt;&amp;lt;xsl:for-each/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;last&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;last&amp;#039;&amp;#039;&amp;#039;()&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает номер последнего элемента в множестве элементов оси. Корректно работает только в цикле &amp;lt;code&amp;gt;&amp;lt;xsl:for-each/&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;count&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;count&amp;#039;&amp;#039;&amp;#039;(node-set)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает количество элементов в &amp;lt;code&amp;gt;node-set&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;name&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;name&amp;#039;&amp;#039;&amp;#039;(node-set?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает полное имя первого тега в множестве&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;namespace-url&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;namespace-url&amp;#039;&amp;#039;&amp;#039;(node-set?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает ссылку на URL, определяющий пространство имён&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;local-name&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;local-name&amp;#039;&amp;#039;&amp;#039;(node-set?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает имя первого тега в множестве, без пространства имён&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;id&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;node-set &amp;#039;&amp;#039;&amp;#039;id&amp;#039;&amp;#039;&amp;#039;(object)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Находит элемент с уникальным идентификатором&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Строковые функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Функция&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Описание&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;string&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;string&amp;#039;&amp;#039;&amp;#039;(object?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает текстовое содержимое элемента. По сути, возвращает объединённое множество &amp;#039;&amp;#039;текстовых&amp;#039;&amp;#039; элементов на &amp;#039;&amp;#039;один&amp;#039;&amp;#039; уровень ниже&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;concat&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;concat&amp;#039;&amp;#039;&amp;#039;(string, string, string*)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Соединяет строки, указанные в аргументах&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;string-length&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;string-length&amp;#039;&amp;#039;&amp;#039;(string?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает длину строки&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;contains&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;contains&amp;#039;&amp;#039;&amp;#039;(string, string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;, если первая строка содержит вторую, иначе — &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;substring&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;substring&amp;#039;&amp;#039;&amp;#039;(string, number, number?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает строку, вырезанную из строки, начиная с указанного номера, и, если указан второй номер, — количество символов&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;substring-before&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;substring-before&amp;#039;&amp;#039;&amp;#039;(string, string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;substring-after&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;substring-after&amp;#039;&amp;#039;&amp;#039;(string, string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;starts-with&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;starts-with&amp;#039;&amp;#039;&amp;#039;(string, string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;, если вторая строка входит в начало первой, иначе — &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;ends-with&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;ends-with&amp;#039;&amp;#039;&amp;#039;(string, string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;, если вторая строка входит в конец первой, иначе — &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;normalize-space&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;normalize-space&amp;#039;&amp;#039;&amp;#039;(string?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;translate&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;translate&amp;#039;&amp;#039;&amp;#039;(string, string, string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. Например, &amp;lt;code&amp;gt;translate(&amp;quot;bar&amp;quot;, &amp;quot;abc&amp;quot;, &amp;quot;ABC&amp;quot;)&amp;lt;/code&amp;gt; вернёт BAr.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Логические функции и операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Символ, оператор&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Значение&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;or&amp;lt;/code&amp;gt; || логическое «или»&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;and&amp;lt;/code&amp;gt; || логическое «и»&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; || логическое «равно»&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;&amp;lt;/code&amp;gt; (&amp;amp;amp;lt;) || логическое «меньше»&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; (&amp;amp;amp;gt;) || логическое «больше»&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;=&amp;lt;/code&amp;gt; (&amp;amp;amp;lt;=) || логическое «меньше либо равно»&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;gt;=&amp;lt;/code&amp;gt; (&amp;amp;amp;gt;=) || логическое «больше либо равно»&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Функция&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Описание&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;boolean&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;boolean&amp;#039;&amp;#039;&amp;#039;(object)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Приводит объект к логическому типу&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;true&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039;()&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает истину&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;false&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;false&amp;#039;&amp;#039;&amp;#039;()&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает ложь&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;not&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039;(boolean)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Отрицание, возвращает истину если аргумент ложь и наоборот&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Числовые функции и операторы ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Символ, оператор&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Значение&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|02}}&amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; || сложение&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|03}}&amp;lt;code&amp;gt;−&amp;lt;/code&amp;gt; || вычитание&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|01}}&amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; || умножение&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;div&amp;lt;/code&amp;gt; || обычное деление (&amp;#039;&amp;#039;&amp;#039;не нацело!&amp;#039;&amp;#039;&amp;#039;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mod&amp;lt;/code&amp;gt; || остаток от деления&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Функция&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Описание&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;number&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;number&amp;#039;&amp;#039;&amp;#039;(object?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Переводит объект в число&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;sum&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;sum&amp;#039;&amp;#039;&amp;#039;(node-set)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Вернёт сумму множества. Каждый тег множества будет преобразован в строку и из него получено число&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;floor&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;floor&amp;#039;&amp;#039;&amp;#039;(number)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает наибольшее целое число, не большее, чем аргумент (округление к меньшему)&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;ceiling&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;ceiling&amp;#039;&amp;#039;&amp;#039;(number)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает наименьшее целое число, не меньшее, чем аргумент (округление к большему)&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;round&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;number &amp;#039;&amp;#039;&amp;#039;round&amp;#039;&amp;#039;&amp;#039;(number)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Округляет число по математическим правилам&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Системные функции ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Функция&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Описание&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;document&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;node-set &amp;#039;&amp;#039;&amp;#039;document&amp;#039;&amp;#039;&amp;#039;(object, node-set?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает документ, указанный в параметре &amp;lt;code&amp;gt;object&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;format-number&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;format-number&amp;#039;&amp;#039;&amp;#039;(number, string, string?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Форматирует число согласно образцу, указанному во втором параметре. Третий параметр указывает именованный формат числа, который должен быть учтён&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;generate-id&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;generate-id&amp;#039;&amp;#039;&amp;#039;(node-set?)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает строку, являющуюся уникальным идентификатором&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;key&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;node-set &amp;#039;&amp;#039;&amp;#039;key&amp;#039;&amp;#039;&amp;#039;(string, object)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает множество с указанным ключом (аналогично функции &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; для идентификаторов)&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;unparsed-entity-uri&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;string &amp;#039;&amp;#039;&amp;#039;unparsed-entity-uri&amp;#039;&amp;#039;&amp;#039;(string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает непроанализированный URI. Если такового нет, возвращает пустую строку&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;element-available&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;element-available&amp;#039;&amp;#039;&amp;#039;(string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;function-available&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;function-available&amp;#039;&amp;#039;&amp;#039;(string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;system-property&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;object &amp;#039;&amp;#039;&amp;#039;system-property&amp;#039;&amp;#039;&amp;#039;(string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Параметры, возвращающие системные переменные. Могут быть:&lt;br /&gt;
* &amp;lt;code&amp;gt;xsl: version&amp;lt;/code&amp;gt; — возвращает версию XSLT процессора.&lt;br /&gt;
* &amp;lt;code&amp;gt;xsl: vendor&amp;lt;/code&amp;gt; — возвращает производителя XSLT процессора.&lt;br /&gt;
* &amp;lt;code&amp;gt;xsl: vendor-url&amp;lt;/code&amp;gt; — возвращает URL, идентифицирующий производителя.&lt;br /&gt;
Если используется неизвестный параметр, функция возвращает пустую строку&lt;br /&gt;
|-&lt;br /&gt;
| data-sort-value=&amp;quot;lang&amp;quot; | {{nowrap|&amp;lt;code&amp;gt;boolean &amp;#039;&amp;#039;&amp;#039;lang&amp;#039;&amp;#039;&amp;#039;(string)&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Возвращает &amp;lt;code&amp;gt;&amp;#039;&amp;#039;&amp;#039;true&amp;#039;&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;, если у текущего тега имеется атрибут &amp;lt;code&amp;gt;xml: lang&amp;lt;/code&amp;gt;, либо родитель тега имеет атрибут &amp;lt;code&amp;gt;xml: lang&amp;lt;/code&amp;gt; и в нём указан совпадающий строке символ&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Предикаты ==&lt;br /&gt;
Предикаты — это логические выражения в квадратных скобках, составленные по тем же принципам, что и выражение отбора. Выражения, возвращающие не логическое значение, а пустой набор элементов, считаются ложными. Выражение, возвращающее число, считается выражением, сравнивающим число с position(). Когда предикатов более одного, каждый из них фильтрует результаты фильтрации предыдущим предикатом.&lt;br /&gt;
&lt;br /&gt;
== Прочие обозначения в XPath ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! data-sort-type=&amp;quot;text&amp;quot; | Обозначение&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; | Описание&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|02}}{{nowrap|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Обозначает &amp;#039;&amp;#039;любое&amp;#039;&amp;#039; имя или набор символов по указанной оси, например: &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; — любой дочерний узел; &amp;lt;code&amp;gt;@*&amp;lt;/code&amp;gt; — любой атрибут&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|01}}{{nowrap|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;$name&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Обращение к переменной. &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; — имя переменной или параметра&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|04}}{{nowrap|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Дополнительные условия выборки (или предикат шага адресации). Должен содержать логическое значение. Если содержит числовое, считается что это порядковый номер узла, что эквивалентно приписыванию перед этим числом выражения &amp;lt;code&amp;gt;position()=&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|05}}{{nowrap|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Если применяется внутри тега другого языка (например HTML), то XSLT-процессор рассматривает содержимое фигурных скобок как XPath&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|03}}{{nowrap|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Определяет уровень дерева, то есть разделяет шаги адресации&lt;br /&gt;
|-&lt;br /&gt;
| {{Hs|06}}{{nowrap|&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;}}&lt;br /&gt;
| Объединяет результат. То есть, в рамках одного пути можно написать несколько путей разбора через знак &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, и в результат такого выражения войдёт всё, что будет найдено любым из этих путей&lt;br /&gt;
|}&lt;br /&gt;
[[Файл:Userstyle-writing-for-medium-com-with-xpath.webm|мини|Написание UserStyle используя XPath трансформированные в CSS]]&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [https://www.w3.org/TR/1999/REC-xpath-19991116/ XPath 1.0. Рекомендация W3C.]{{ref|en}}&lt;br /&gt;
* [http://www.w3.org/TR/xpath20 XPath 2.0. Рекомендация W3C.]{{ref|en}}&lt;br /&gt;
* [http://www.w3.org/TR/xpath-21 XPath 2.1. Рекомендация W3C.]{{ref|en}}&lt;br /&gt;
* [http://www.citforum.ru/internet/xpath/index.shtml XPath 1.0. Перевод рекомендации W3C на русский язык.]&lt;br /&gt;
* [http://www.zvon.org/xxl/XPathTutorial/General_rus/examples.html XPath в примерах]&lt;br /&gt;
* [https://xakep.ru/2008/06/24/44160/ XPath-инъекции]&lt;br /&gt;
* [http://www.quizful.net/post/xpath-in-javascript XPath в JavaScript]&lt;br /&gt;
&lt;br /&gt;
{{нет источников|дата=2015-04-19}}&lt;br /&gt;
{{Языки запросов}}&lt;br /&gt;
{{XSL}}&lt;br /&gt;
{{Стандарты W3C}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:XML]]&lt;br /&gt;
[[Категория:Стандарты W3C]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Alex NB OT</name></author>
	</entry>
</feed>