XPath 3.1¶
XPath 3.1 — это версия языка запросов XPath, предназначенного для навигации по XML-документам и извлечения данных из них, а также для работы с JSON и другими моделями данных. Разработанный консорциумом W3C, XPath 3.1 является частью семейства стандартов XSLT 3.0 и XQuery 3.1. Версия 3.1 была опубликована как рекомендация W3C 21 марта 2017 года, заменив XPath 3.0. Основные нововведения включают поддержку JSON, работу с массивами и картами, а также расширенные функции для обработки данных.
¶История и развитие
XPath (XML Path Language) изначально был создан для адресации частей XML-документов. Первая версия, XPath 1.0, стала рекомендацией W3C в 1999 году. XPath 2.0, выпущенный в 2007 году, значительно расширил возможности языка, добавив типизацию, поддержку схем XML и функции для работы с последовательностями. XPath 3.0 (2014 год) внёс поддержку анонимных функций, встроенных типов и улучшенную обработку ошибок.
XPath 3.1 стал следующим шагом, ориентированным на интеграцию с JSON и современными форматами данных. Работа над версией началась в 2015 году, а финальная спецификация была утверждена 21 марта 2017 года. Разработка велась рабочей группой W3C по XSLT и XQuery, с учётом обратной совместимости с предыдущими версиями.
¶Основные возможности
¶Поддержка JSON и карт
XPath 3.1 вводит два новых типа данных: карты (maps) и массивы (arrays). Карты представляют собой неупорядоченные коллекции пар «ключ-значение», где ключи могут быть строками или числами, а значения — любыми типами данных XPath. Массивы — упорядоченные последовательности значений, доступ к которым осуществляется по целочисленному индексу. Эти типы позволяют напрямую обрабатывать JSON-структуры без преобразования в XML.
Пример создания карты: `` map{"name": "Иван", "age": 30} ``
Пример доступа к элементу массива: `` array{"a", "b", "c"}?1 (возвращает "a") ``
¶Функции для работы с JSON
В XPath 3.1 добавлены функции для парсинга и сериализации JSON:
json-to-xml($json)— преобразует JSON-строку в XML-документ.xml-to-json($xml)— обратное преобразование.parse-json($string)— разбирает JSON-строку в карты и массивы.serialize-json($input)— сериализует данные в JSON-строку.
Эти функции упрощают интеграцию с веб-API и базами данных, использующими JSON.
¶Лямбда-выражения и функции высшего порядка
XPath 3.1 поддерживает анонимные функции (лямбды) и функции высшего порядка, что позволяет писать компактный и выразительный код. Например, можно передать функцию в качестве аргумента другой функции:
`` let $double := function($x) { $x * 2 } return for-each((1,2,3), $double) (возвращает 2,4,6) ``
¶Работа с последовательностями
Язык сохраняет и расширяет возможности работы с последовательностями (ordered sequences), которые являются основой XPath. В XPath 3.1 добавлены новые функции для фильтрации, сортировки и агрегации данных, такие как sort(), filter(), fold-left() и fold-right().
¶Типизация и схемы
XPath 3.1 полностью поддерживает типы из XML Schema, включая атомарные типы (строка, число, дата) и сложные типы. Это обеспечивает строгую проверку типов на этапе выполнения и повышает надёжность запросов.
¶Синтаксис и выражения
¶Пути и навигация
Основой XPath остаются выражения пути, которые позволяют перемещаться по дереву документа. В XPath 3.1 поддерживаются как абсолютные (начинающиеся с /), так и относительные пути. Примеры:
/root/child— выбирает все элементыchildвнутри корневого элементаroot.//item— выбирает все элементыitemв документе.@attr— обращение к атрибуту.
¶Условные выражения и циклы
XPath 3.1 включает конструкции if-then-else, for и let: `` if ($x > 0) then "положительное" else "отрицательное" for $i in (1 to 10) return $i * 2 let $sum := sum((1,2,3)) return $sum ``
¶Регулярные выражения
Для работы со строками доступны функции, использующие регулярные выражения (стандарт XSD):
matches($string, $pattern)— проверка соответствия.replace($string, $pattern, $replacement)— замена.tokenize($string, $pattern)— разбиение на подстроки.
¶Применение
¶Обработка XML
XPath 3.1 широко используется в системах, работающих с XML-документами: базы данных (например, BaseX, eXist-db), преобразователи XSLT 3.0, парсеры и веб-сервисы. Язык позволяет извлекать данные, фильтровать записи и выполнять сложные запросы.
¶Работа с JSON
Благодаря поддержке JSON, XPath 3.1 применяется для обработки данных из современных веб-API, конфигурационных файлов и NoSQL-баз данных (например, MarkLogic). Например, можно извлечь все значения ключа name из JSON-массива: `` let $data := parse-json('[{"name":"Анна"},{"name":"Пётр"}]') return $data?*?name ``
¶Интеграция с XSLT и XQuery
XPath 3.1 является подмножеством XSLT 3.0 и XQuery 3.1. Это означает, что код XPath может быть встроен в шаблоны XSLT или запросы XQuery, обеспечивая единый синтаксис для разных задач.
¶Примеры использования
¶Пример 1: Извлечение данных из XML
Допустим, есть XML-документ: ``xml <books> <book year="2020"> <title>Война и мир</title> <author>Лев Толстой</author> </book> <book year="2021"> <title>Преступление и наказание</title> <author>Фёдор Достоевский</author> </book> </books> ``
Запрос XPath 3.1 для получения названий книг, изданных после 2020 года: `` //book[@year > 2020]/title/text() ` Результат: "Преступление и наказание"`.
¶Пример 2: Обработка JSON
JSON-данные: ``json [ {"city": "Москва", "population": 12600000}, {"city": "Санкт-Петербург", "population": 5380000} ] ``
Запрос для получения городов с населением более 5 миллионов: `` let $cities := parse-json('...') return $cities[?population > 5000000]?city ` Результат: "Москва"`.
¶Критика и ограничения
XPath 3.1, несмотря на расширенные возможности, имеет ряд недостатков:
- Сложность обучения: Для новичков синтаксис с функциями высшего порядка и картами может быть непривычным.
- Производительность: Обработка больших JSON-структур может быть медленнее, чем в специализированных языках (например, jq).
- Ограниченная поддержка: Не все реализации XPath 3.1 полностью поддерживают спецификацию, особенно в части JSON и карт.
¶Реализации
XPath 3.1 поддерживается следующими инструментами и библиотеками:
- Saxon (версия 9.8 и выше) — одна из наиболее полных реализаций, доступна для Java и .NET.
- BaseX — XML-база данных с поддержкой XPath 3.1.
- eXist-db — ещё одна база данных, поддерживающая XPath 3.1.
- Altova XMLSpy — коммерческий редактор XML с поддержкой XPath 3.1.
- xmllint (через libxml2) — частичная поддержка (до версии 2.0).
¶Интересные факты
- XPath 3.1 стал первым языком запросов, который одновременно поддерживает XML и JSON на уровне типов данных.
- Спецификация XPath 3.1 занимает около 200 страниц, включая функции и выражения.
- Язык используется в системах электронного документооборота и научных исследованиях, где требуется обработка структурированных данных.
¶Источники
- W3C Recommendation: XPath 3.1 (21 March 2017)
- Michael Kay. XSLT 3.0 and XPath 3.1: A Developer's Guide. — 2017.
- Документация Saxon (Saxonica)
- BaseX Documentation: XPath 3.1
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


