xslt-transducer — техническое описание проекта


1. Назначение и амбиция

xslt-transducer — суверенная (с нуля, без FFI к чужим движкам) реализация семейства языков XPath / XQuery / XSLT на Rust. Ставка: иметь собственный движок XML-трансформаций как алгебраическое ядро (“XML-pivot”), не завися от Saxon (Java/GraalVM) и не ограничиваясь XPath 1.0, который покрывают существующие Rust-крейты.

Зачем именно своё (подтверждается census-отчётом проекта): в экосистеме Rust нет чистой реализации XPath 2.0+. sxd-xpath — это XPath 1.0 (последнее обновление 2018), libxml — FFI-обёртка над C-библиотекой libxml2. Ниша “эргономичный, поддерживаемый pure-Rust движок XPath 3.1/4.0” пуста — проект целится в неё.

Архитектурная амбиция (из doc-комментария движка): движок строится на алгебраическом базисе из 4 примитивов {ε, ⊕, φ, Δ} (пустота, конкатенация, отображение/фильтр, рекурсия по дереву), над которыми надстраиваются производные операции, а уже над ними — полный XPath. Целевой уровень — XPath 4.0 (надмножество 3.1: добавлены otherwise, pipeline-оператор, строковые шаблоны, focus-функции, sequence-стрелки, method-вызовы и 50+ новых функций). Формальная база описана в проектных документах по алгебре XPath, DSS и схем (суммарно ~640 КБ заметок).


2. Архитектура (подпроекты)

Workspace из 4 крейтов:

Крейт Роль Зрелость
xpath-core Сам движок: лексер → парсер → AST → desugar в алгебру → эвалуатор + библиотека функций + модель данных XDM + система типов + XSD-схемы основной, зрелый
xpath-harness Прогон официального W3C-корпуса QT3/QT4: парсер каталога тестов, модель тест-кейса с логикой зависимостей/пропусков, проверка ассертов, параллельный запуск (rayon) рабочий инструмент
xpath-census Статистический инвентарь: сканирует корпуса тестов, считает частоту функций/осей/операторов/фич, чтобы приоритизировать реализацию. Это НЕ отчёт pass/fail вспомогательный
dss-core Отдельный, более ранний прототип XSLT-трансформации: алгебраическая модель XML “DSS” (свободный моноид Item’ов), parse/serialize/transform/парсер stylesheet ранний прототип

xpath-core — внутреннее устройство

Модули: lexer, parser, ast, desugar, eval, functions, xdm, types, derived, axes, primitives, error, schema.

Версии спецификаций: целится в XPath/XQuery 3.1 (полноценно) и 4.0 (фронтир, частично). Эвалуатор использует семантику XQuery 3.1; harness осознанно пропускает тесты с xpath-only-семантикой и со специфичной для XQuery 1.0/3.0 семантикой (см. §4).


3. Объём и зрелость (цифры)

Метрика Значение
LOC xpath-core (Rust, code) 40 653 строк, 23 файла
LOC всего репозитория (Rust, code, без target) ~49 358 строк, 43 файла
Юнит-тестов в xpath-core (#[test]) 293
Функций parse_* (рекурсивный спуск) 89
Ветвей диспетчеризации функций ~698
struct/enum/trait/fn в eval.rs 3 struct, 3 enum, 4 impl, 104 fn

Корпус тестов в проекте: QT3 61 МБ, QT4 63 МБ, XSLT 3.0 391 МБ, XSLT 4.0 326 МБ (всего ~840 МБ официальных W3C тест-данных).

Вердикт по зрелости (честно): xpath-core — это рабочий, в значительной степени полный движок XPath/XQuery 3.1, заметно дальше «прототипа», но не production. Аргументы: - ЗА зрелость: ~40 К LOC, 293 юнит-теста, ~98 % прохождения попыток на официальном W3C QT3, 0 паник/ошибок исполнения на 75 К тест-кейсов (см. §4) — движок устойчив. - ПРОТИВ production: нет стабильного/документированного публичного API (есть лишь select/eval_string/test/parse), нет бенчмарков производительности и фаззинга в дереве, осознанно не реализованы XQuery-модули, static typing, schema-import, часть collations, DTD-типы, методы сериализации (json/text/xhtml). - XSLT-слой (dss-core) — ранний прототип (март 2026, roundtrip-тесты XML, базовый transform), несопоставим по зрелости с xpath-core. Полноценного XSLT-движка пока нет.

Одним словом: продвинутый рабочий движок XPath/XQuery 3.1, предпродакшен.


4. Тесты / conformance (реальные числа)

Прогон выполнен заново на release-бинаре harness, --jobs 8. Это официальные W3C тест-сьюты (QT3 = XPath/XQuery 3.1, QT4 = черновик XPath/XQuery 4.0).

QT3 (XPath / XQuery 3.1)

Результат Кол-во % от всех
Total test-cases 31 703 100 %
Passed 30 139 95.1 %
Failed 674 2.1 %
Skipped 890 2.8 %
Errors (паники/краши) 0 0.0 %

Прохождение от попыток (без пропущенных): 30 139 / 30 813 = 97.8 %.

QT4 (XPath / XQuery 4.0, черновик)

Результат Кол-во % от всех
Total test-cases 43 288 100 %
Passed 29 970 69.2 %
Failed 1 775 4.1 %
Skipped 11 543 26.7 %
Errors 0 0.0 %

Прохождение от попыток (без пропущенных): 29 970 / 31 745 = 94.4 %. Низкий «сырой» процент QT4 объясняется тем, что 4.0 — движущийся фронтир: 26.7 % пропущено (нереализованные 4.0-фичи, XQuery, static typing), а провалы — это новый синтаксис 4.0, который парсер ещё не разбирает.

Что пропускается (важно для честности)

Процент считается по поддерживаемому подмножеству. Harness осознанно пропускает: xpath-only-тесты (движок на семантике XQuery), тесты только для XQuery 1.0/3.0, а также фичи: typedData, staticTyping, serialization, infoset-dtd, xpath-1.0-compatibility, non_empty_sequence_collection, schema-import-наборы.

Где провалы (категории «got:»)

QT3, 674 провала: доминирует 554 = parse error (XPST) — почти все на крае синтаксиса (включая негативные тесты на коды ошибок, где наш код ошибки не совпал). Дальше длинный хвост по ~3–13 шт.: FORG/FODC/FOER (динамические ошибки аргументов, fn:error), lax-валидация схемы (__validate_lax__), отдельные collation, несколько расхождений значений. Единой крупной функциональной дыры нет — здоровый профиль.

QT4, 1 775 провалов: в основном (а) новый синтаксис 4.0, который парсер не берёт (614 XPST + сотни «unexpected token»), и (б) необязательные EXPath-модули, которых нет: bin: (бинарный модуль, ~25 функций) и file: (файловый модуль) — суммарно сотни кейсов; плюс предложенная ось preceding-or-self. То есть провалы QT4 — это экспериментальный край и опциональные расширения, а не дефекты ядра.


5. Чем ценно для работодателя (демонстрируемые навыки)

Главный тезис для собеседования: «Своя реализация XPath/XQuery 3.1 на Rust, ~98 % прохождения официального W3C-теста на поддерживаемом подмножестве, 0 крашей на 75 000 тест-кейсов; цель — XPath 4.0, частично реализовано».


Приложение: где меряно, а где оценено


Контакты

Гура Денис

Приложения