====== XPATH ======

===== Оси =====

Оси — это база языка XPath. Для некоторых осей существуют сокращённые обозначения.

  * child:: — содержит множество элементов-потомков (элементов, расположенных на один уровень ниже). Это название сокращается полностью, то есть его можно вовсе опускать.
  * descendant:: — содержит полное множество элементов-потомков (то есть, как ближайших элементов-потомков, так и всех их элементов-потомков).
  * descendant-or-self:: — содержит полное множество элементов-потомков и текущий элемент. Выражение /descendant-or-self::node()/ можно сокращать до //. С помощью этой оси, например, можно вторым шагом организовать отбор элементов с любого узла, а не только с корневого: достаточно первым шагом взять всех потомков корневого. Например, путь //span отберёт все узлы span документа, независимо от их положения в иерархии, взглянув как на имя корневого, так и на имена всех его дочерних элементов, на всю глубину их вложенности.
  * ancestor:: — содержит множество элементов-предков.
  * ancestor-or-self:: — содержит множество элементов-предков и текущий элемент.
  * parent:: — содержит элемент-предок на один уровень назад. Это обращение можно заменить на ..
  * self:: — содержит текущий элемент. Это обращение можно заменить на .
  * following:: — содержит множество элементов, расположенных ниже текущего элемента по дереву (на всех уровнях и слоях), исключая собственных потомков.
  * following-sibling:: — содержит множество братских элементов того же уровня, следующих за текущим слоем.
  * preceding:: — содержит множество элементов, расположенных выше текущего элемента по дереву (на всех уровнях и слоях), исключая множество собственных предков.
  * preceding-sibling:: — содержит множество братских элементов того же уровня, предшествующих текущему слою.
  * attribute:: — содержит множество атрибутов текущего элемента. Это обращение можно заменить на символ @
  * space:: — содержит множество элементов, относящихся к тому или иному пространству имён (то есть присутствует атрибут xmlns).

===== Функции над множествами узлов =====

^ |Функция|	Описание^
|node-set| node()|	Возвращает сам узел. Вместо этой функции часто используют заменитель *, но, в отличие от звёздочки, функция node() возвращает и текстовые узлы|
|string| text()	Возвращает узел, если он текстовый|
|node-set| current()|	Возвращает множество из одного элемента, который является текущим. Если мы делаем обработку множества с предикатами, то единственным способом дотянуться из этого предиката до текущего элемента будет данная функция|
|number| position()|	Возвращает позицию элемента в множестве элементов оси. Корректно работает только в цикле <xsl:for-each/>|
|number| last()|	Возвращает номер последнего элемента в множестве элементов оси. Корректно работает только в цикле <xsl:for-each/>|
|number| count(node-set)|	Возвращает количество элементов в node-set.|
|string| name(node-set?)|	Возвращает полное имя первого тега в множестве|
|string| namespace-url(node-set?)|	Возвращает ссылку на URL, определяющий пространство имён|
|string| local-name(node-set?)|	Возвращает имя первого тега в множестве, без пространства имён|
|node-set| id(object)|	Находит элемент с уникальным идентификатором|


===== Строковые функции =====

^ |Функция|	Описание^
|string| string(object?)|	Возвращает текстовое содержимое элемента. По сути, возвращает объединённое множество текстовых элементов на один уровень ниже|
|string| concat(string, string, string*)|	Соединяет строки, указанные в аргументах|
|number| string-length(string?)|	Возвращает длину строки|
|boolean| contains(string, string)|	Возвращает true, если первая строка содержит вторую, иначе — false|
|string| substring(string, number, number?)|	Возвращает строку, вырезанную из строки, начиная с указанного номера, и, если указан второй номер, — количество символов|
|string| substring-before(string, string)|	Если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки|
|string| substring-after(string, string)|	Если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки|
|boolean| starts-with(string, string)|	Возвращает true, если вторая строка входит в начало первой, иначе — false|
|boolean| ends-with(string, string)|	Возвращает true, если вторая строка входит в конец первой, иначе — false|
|string| normalize-space(string?)|	Убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами|
|string| translate(string, string, string)|	Заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. Например, translate("bar", "abc", "ABC") вернёт BAr.|

===== Логические функции и операторы =====

^Символ, оператор|	Значение|
|<code>or</code>|	логическое «или»|
|<code>and</code>|	логическое «и»|
|<code>=</code>|	логическое «равно»|
|<code>< (&lt;)</code>|	логическое «меньше»|
|<code>> (&gt;)</code>|	логическое «больше»|
|<code><= (&lt;=)</code>|	логическое «меньше либо равно»|
|<code>>= (&gt;=)</code>|	логическое «больше либо равно»|


^|Функция|	Описание^
|boolean| boolean(object)|	Приводит объект к логическому типу|
|boolean| true()|	Возвращает истину|
|boolean| false()|	Возвращает ложь|
|boolean| not(boolean)|	Отрицание, возвращает истину если аргумент ложь и наоборот

===== Числовые функции и операторы =====

^Символ, оператор|	Значение|
|+|	сложение|
|−|	вычитание|
|*|	умножение|
|div|	обычное деление (не нацело!)|
|mod|	остаток от деления|


^ |Функция|	Описание^
|number| number(object?)|	Переводит объект в число|
|number| sum(node-set)|	Вернёт сумму множества. Каждый тег множества будет преобразован в строку и из него получено число|
|number| floor(number)|	Возвращает наибольшее целое число, не большее, чем аргумент (округление к меньшему)|
|number| ceiling(number)|	Возвращает наименьшее целое число, не меньшее, чем аргумент (округление к большему)|
|number| round(number)|	Округляет число по математическим правилам|


===== Системные функции =====

^ |Функция|	Описание^
|node-set| document(object, node-set?)|	Возвращает документ, указанный в параметре object|
|string| format-number(number, string, string?)|	Форматирует число согласно образцу, указанному во втором параметре. Третий параметр указывает именованный формат числа, который должен быть учтён|
|string| generate-id(node-set?)|	Возвращает строку, являющуюся уникальным идентификатором|
|node-set| key(string, object)|	Возвращает множество с указанным ключом (аналогично функции id для идентификаторов)|
|string| unparsed-entity-uri(string)|	Возвращает непроанализированный URI. Если такового нет, возвращает пустую строку|
|boolean| element-available(string)|	Проверяет, доступен ли элемент или множество, указанное в параметре. Параметр рассматривается как XPath|
|boolean| function-available(string)|	Проверяет, доступна ли функция, указанная в параметре. Параметр рассматривается как XPath|
|object| system-property(string)|	Параметры, возвращающие системные переменные. Могут быть:|
| |xsl:| version — возвращает версию XSLT процессора.|
| |xsl:| vendor — возвращает производителя XSLT процессора.|
| |xsl:| vendor-url — возвращает URL, идентифицирующий производителя. Если используется неизвестный параметр, функция возвращает пустую строку|
|boolean| lang(string)|	Возвращает true, если у текущего тега имеется атрибут xml: lang, либо родитель тега имеет атрибут xml: lang и в нём указан совпадающий строке символ|

  * *	Обозначает любое имя или набор символов по указанной оси, например: * — любой дочерний узел; @* — любой атрибут
  * $name	Обращение к переменной. name — имя переменной или параметра
  * []	Дополнительные условия выборки (или предикат шага адресации). Должен содержать логическое значение. Если содержит числовое, считается что это порядковый номер узла, что эквивалентно приписыванию перед этим числом выражения position()=
  * {}	Если применяется внутри тега другого языка (например HTML), то XSLT-процессор рассматривает содержимое фигурных скобок как XPath
  * /	Определяет уровень дерева, т. е. разделяет шаги адресации
  * |	Объединяет результат. Т. е., в рамках одного пути можно написать несколько путей разбора через знак |, и в результат такого выражения войдёт всё, что будет найдено любым из этих путей