无论25位数字是十进制和整数还是整数,DOMDocument::schemaValidate()都会触发警告,返回false,然后libxml_get_errors();捕获下一个错误:
PHP片段:

$DD = new DOMDocument('1.0', 'ISO-8859-1');
$DD -> loadXML('<?xml version ="1.0" encoding="ISO-8859-1"?><a></a>');
libxml_use_internal_errors(true);
$old_libxml_disable_entity_loader = libxml_disable_entity_loader(false);
$DD -> schemaValidate(__DIR__ . '/schemas/schema.xsd'); // WARNING
libxml_disable_entity_loader($old_libxml_disable_entity_loader);
$errors = libxml_get_errors();

foreach ($errors as $error) { // PRINT ERRORS
    echo $error -> code . '<br>';
    echo $error -> message . '<br>';
}

DOMDocument::schemaValidate()生成的错误:
错误1824:
元素{http://www.w3.org/2001/XMLSchema}maxInclusive':
“999999999999999999999999999999”不是
原子类型“xs:decimal”。在/path/schema.xsd的x行
错误1717:
元素{http://www.w3.org/2001/XMLSchema}maxInclusive:值
方面的“999999999999999999999999999”未验证
相对于基类型{http://www.w3.org/2001/XMLSchema}decimal。在里面
/第x行的path/schema.xsd
有效架构(仅限无效XML):
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema
    targetNamespace="http://www.lala.com/la"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:la="http://www.lala.com/la"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">

    <xs:simpleType name="AmountType">
        <xs:restriction base="xs:decimal">
            <xs:totalDigits value="100"/>
            <xs:fractionDigits value="20"/>
            <xs:maxInclusive value="999999999999999999999999"/><!-- 24 DIGITS -->
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

无效架构:warning+libxml无效架构的内部错误
<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema
    targetNamespace="http://www.lala.com/la"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:la="http://www.lala.com/la"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">

    <xs:simpleType name="AmountType">
        <xs:restriction base="xs:decimal">
            <xs:totalDigits value="100"/>
            <xs:fractionDigits value="20"/>
            <xs:maxInclusive value="9999999999999999999999999"/><!-- 25 DIGITS -->
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

php版本:5.5.20
libxml版本:2.9.2

最佳答案

根据W3C XML Schema Part 2: Datatypes Second Edition,libxml2可以限制maxInclusive的范围,因为它可以限制xs:decimal的值空间的范围。
4.3.7 maxInclusive:
[定义:]maxInclusive是
·值空间·用于具有·ordered·属性的数据类型。价值
maxInclusive·必须·在·基本类型·的·值空间·中。
3.2.3 decimal
注:所有最小一致性处理器必须支持十进制
最少有18位小数的数字(即
·共18位)。然而,·最小一致性·处理器·可以·
设置应用程序定义的最大小数位数限制
他们准备支持的数字,在这种情况下
必须清楚记录应用程序定义的最大数量。

09-20 17:07