Открыть сервис

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 →