Полная реализация алгоритма трансформации "urn://smev-gov-ru/xmldsig/transform" для Python согласно официальной документации СМЭВ 3.5.0.27.
Это улучшенный порт оригинальной PHP библиотеки danbka/smev-transform на Python с полной поддержкой всех 9 шагов трансформации.
Примечание: Эта библиотека является компонентом основного проекта giis-signer - инструмента для работы с электронной подписью и СМЭВ3.
Алгоритм адаптирован для СМЭВ версии 3.5.0.27 согласно официальной документации:
- Методические документы СМЭВ3
- Версия спецификации: 3.5.0.27
КРИТИЧЕСКОЕ ОБНОВЛЕНИЕ: Добавлена полная поддержка Шага 9 - Декодирование текста, который отсутствовал в оригинальной PHP библиотеке!
✅ Шаг 9.1 - Декодирование текстовых блоков:
- Снятие экранирования символов (

,<,&и др.) - Корректная обработка CDATA секций
- Умное кодирование блоков по размеру (до 11 символов / от 12 символов)
- Условное кодирование символа
>согласно спецификации
✅ Шаг 9.2 - Декодирование атрибутов:
- Нормализация пробельных символов в атрибутах
- Снятие экранирования в значениях атрибутов
- Правильное кодирование атрибутов
При подписании XML-фрагментов ЭП в формате XMLDSig, обязательно использование трансформации urn://smev-gov-ru/xmldsig/transform.
- ✅ XML declaration и processing instructions удаляются
- ✅ Пробельные символы удаляются из текстовых узлов
- ✅ Empty element tags преобразуются в пары start-tag + end-tag
- ✅ Неиспользуемые namespace prefix удаляются
- ✅ Namespace declarations проверяются и добавляются при необходимости
- ✅ Автоматические префиксы генерируются (ns1, ns2, ...)
- ✅ Атрибуты сортируются в алфавитном порядке
- ✅ Namespace declarations размещаются перед атрибутами
- ✅ Декодирование текста (НОВОЕ!) - полная обработка текстовых блоков и атрибутов
pip install smev-transformgit clone https://github.com/imdeniil/smev-transform
cd smev-transform
pip install -e .uv pip install smev-transformfrom smev_transform import Transform
transform = Transform()
result = transform.process(xml_string)from smev_transform import TextDecoder, AttributeDecoder
# Декодирование текстовых блоков
decoded_text = TextDecoder.decode_text_block(text_with_entities)
# Декодирование атрибутов
decoded_attr = AttributeDecoder.decode_attribute_value(attr_value)from smev_transform import Transform
xml = '''<?xml version="1.0" encoding="UTF-8"?>
<elementOne xmlns="http://test/1" xmlns:qwe="http://test/2">
<qwe:elementTwo attB="bbb" attA="aaa"/>
</elementOne>'''
transform = Transform()
result = transform.process(xml)
print(result)
# Результат: <ns1:elementOne xmlns:ns1="http://test/1"><ns2:elementTwo xmlns:ns2="http://test/2" attA="aaa" attB="bbb"></ns2:elementTwo></ns1:elementOne>from smev_transform import Transform
xml = '''<root>>>text&content<</root>'''
transform = Transform()
result = transform.process(xml)
print(result)
# Текст проходит декодирование согласно алгоритму СМЭВfrom smev_transform import Transform
xml = '''<root attr="value with tabs and
newlines"/>'''
transform = Transform()
result = transform.process(xml)
print(result)
# Пробельные символы в атрибутах нормализуются согласно СМЭВfrom smev_transform import Transform
xml = '''<root>
Текст до CDATA
<![CDATA[Сырой контент < & > остается нетронутым]]>
Текст после CDATA
</root>'''
transform = Transform()
result = transform.process(xml)
# CDATA секции обрабатываются корректно согласно спецификации# Все тесты
pytest
# С подробным выводом
pytest -v
# Конкретные тесты
pytest smev_transform/tests/test_transform.py -v
pytest smev_transform/tests/test_text_decoder.py -v
pytest smev_transform/tests/test_attribute_decoder.py -v
# С покрытием кода
pytest --cov=smev_transform --cov-report=html| Функциональность | PHP версия | Python v2.0 |
|---|---|---|
| Шаги 1-8 (базовая трансформация) | ✅ | ✅ |
| Шаг 9.1 (декодирование текста) | ❌ ОТСУТСТВУЕТ | ✅ РЕАЛИЗОВАНО |
| Шаг 9.2 (декодирование атрибутов) | ❌ ОТСУТСТВУЕТ | ✅ РЕАЛИЗОВАНО |
| Обработка CDATA | ✅ Полностью | |
| Соответствие официальной спецификации | ✅ 100% |
- Python 3.7+
- Только стандартная библиотека Python (xml.etree.ElementTree)
smev-transform/
├── smev_transform/ # Основной пакет
│ ├── __init__.py # Инициализация модуля
│ ├── transform.py # Главный класс Transform
│ ├── text_decoder.py # Декодирование текстовых блоков (Шаг 9.1)
│ ├── attribute_decoder.py # Декодирование атрибутов (Шаг 9.2)
│ ├── xml_namespace.py # Работа с XML namespaces
│ ├── attribute.py # Представление XML атрибутов
│ ├── comparators.py # Сортировка атрибутов
│ ├── exceptions.py # Исключения
│ └── tests/ # Тесты пакета
│ ├── test_transform.py
│ ├── test_text_decoder.py
│ └── test_attribute_decoder.py
├── docs/ # Документация
│ ├── CHANGELOG.md
│ ├── CLASSES.md
│ ├── FILES.md
│ ├── TECH.md
│ └── TRANSIT.md
├── setup.py # Конфигурация setuptools
├── pyproject.toml # Современная конфигурация пакета
├── README.md # Этот файл
├── LICENSE # MIT License
└── requirements.txt # Dev зависимости
- API полностью совместимо - никаких изменений в коде не требуется
- Результаты трансформации могут отличаться из-за добавления Шага 9
- Рекомендуется протестировать с реальными СМЭВ сообщениями
- ✅ Версия 2.0 рекомендована для всех новых проектов
- ✅ Полное соответствие официальной документации СМЭВ3
- ✅ Корректная работа с реальными СМЭВ сообщениями
-
Клонируйте репозиторий:
git clone https://github.com/imdeniil/smev-transform cd smev-transform -
Создайте виртуальное окружение с uv:
uv venv
-
Активируйте окружение:
# Windows .venv\Scripts\activate # Linux/macOS source .venv/bin/activate
-
Синхронизируйте зависимости:
uv sync
# С dev зависимостями
uv pip install -e ".[dev]"
# Или напрямую
pip install -e ".[dev]"# Все тесты
pytest
# С подробным выводом
pytest -v
# С покрытием кода
pytest --cov=smev_transform --cov-report=html# Сборка пакета
uv build
# Публикация (требуется API token)
uv publishDaniil (@imdeniil)
- Email: [email protected]
- GitHub: https://github.com/imdeniil/
MIT License - см. файл LICENSE для деталей.
Если вы обнаружили баг или у вас есть предложения по улучшению, пожалуйста, создайте issue на GitHub.