Пакет, реализующий алгоритм трансформации "urn://smev-gov-ru/xmldsig/transform"
При подписании XML-фрагментов ЭП в формате XMLDSig, обязательно использование трансформации urn://smev-gov-ru/xmldsig/transform.
- XML declaration и processing instructions, если есть, вырезаются;
- Если текстовый узел содержит только пробельные символы (код символа меньше или равен '\u0020'), этот текстовый узел вырезается;
- После применения правил из пунктов 1 и 2, если даже у элемента нет дочерних узлов, элемент не может быть представлен в виде empty element tag (http://www.w3.org/TR/2008/REC-xml-20081126/#sec-starttags, правило [44]), а должен быть преобразован в пару start-tag + end-tag;
- Удалить namespace prefix, которые на текущем уровне объявляются, но не используются;
- Проверить, что namespace текущего элемента объявлен либо выше по дереву, либо в текущем элементе. Если не объявлен, объявить в текущем элементе;
- Namespace prefix элементов и атрибутов должны быть заменены на автоматически сгенерированные. Сгенерированный префикс состоит из литерала «ns», и порядкового номера сгенерированного префикса в рамках обрабатываемого XML-фрагмента, начиная с единицы. При генерации префиксов должно устраняться их дублирование;
- Атрибуты должны быть отсортированы в алфавитном порядке: сначала по namespace URI (если атрибут - в qualified form), затем – по local name. Атрибуты в unqualified form после сортировки идут после атрибутов в qualified form;
- Объявления namespace prefix должны находиться перед атрибутами. Объявления префиксов должны быть отсортированы в порядке объявления, а именно:
- Первым объявляется префикс пространства имён элемента, если он не был объявлен выше по дереву;
- Дальше объявляются префиксы пространств имён атрибутов, если они требуются. Порядок этих объявлений соответствует порядку атрибутов, отсортированных в алфавитном порядке (см. п.7 текущего перечня).
composer require danbka/smev-transform
use Danbka\Smev\Transform;
$transform = new Transform();
$transform->process($xml);