plinskiy/smev-transform

实现urn://smev-gov-ru/xmldsig/transform算法的СМЭВ3

1.2 2023-06-20 14:54 UTC

This package is auto-updated.

Last update: 2024-09-20 17:52:58 UTC


README

描述

实现"urn://smev-gov-ru/xmldsig/transform"转换算法的包

为什么

在XMLDSig格式下对XML片段进行电子签名时,必须使用urn://smev-gov-ru/xmldsig/transform转换。

转换算法

  1. 如果存在,删除XML声明和处理指令;
  2. 如果文本节点仅包含空白字符(字符代码小于或等于'\u0020'),则删除该文本节点;
  3. 应用第1和第2点规则后,即使元素没有子节点,也不能用空元素标签表示(见http://www.w3.org/TR/2008/REC-xml-20081126/#sec-starttags,规则[44]),而应该转换为start-tag + end-tag对;
  4. 删除在当前级别声明但未使用的命名空间前缀;
  5. 检查当前元素的命名空间是否在树的上层或当前元素中声明。如果没有声明,则在当前元素中声明;
  6. 元素的命名空间前缀和属性应替换为自动生成的。生成的前缀由“ns”和生成前缀的序号组成,该序号从1开始,并在处理XML片段时生成。在生成前缀时,应避免重复;
  7. 属性应按字母顺序排序:首先按namespace URI排序(如果属性为qualified形式),然后按local name排序。排序后,未命名的属性将按顺序排列在命名的属性之后;
  8. 命名空间前缀的声明应位于属性之前。前缀的声明应按声明顺序排序,具体如下
    • 首先声明元素命名空间的前缀,如果它尚未在上层声明;
    • 然后声明所需的属性命名空间的前缀。这些声明的顺序应与排序后的属性顺序一致(见当前列表的第7点);

安装

composer require danbka/smev-transform

使用

use Danbka\Smev\Transform;

$transform = new Transform();
$transform->process($xml);