为什么当maxInclusive有25位或更多的数字时,Libxml说模式无效


Why Libxml says invalid schema when maxInclusive have 25 or more digits?

无论这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() Generated Errors:

错误1824:

元素"{http://www.w3.org/2001/XMLSchema} maxInclusive":' 9999999999999999999999999999999999999 '不是原子类型'xs:decimal'。在模式/路径。xsd在X行

错误1717:

元素{http://www.w3.org/2001/XMLSchema}maxInclusive':值' 99999999999999999999999999999999999 '的面无效针对基类型"{http://www.w3.org/2001/XMLSchema}decimal"。在//模式的道路。xsd在X行

有效模式(仅限无效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>

Invalid 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 version: 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小数

注意:所有符合最低标准的处理器必须支持十进制至少有18位十进制数字的数字(即带·totalDigits·of 18)。然而,·最低限度符合要求的·加工者·可以·设置应用程序定义的最大十进制数限制他们准备支持的数字,在这种情况下应用程序定义的最大数量必须清楚地记录。