Почему Libxml сообщает неверную схему, если maxInclusive содержит 25 или более цифр?

Будь 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 ‘:
‘9999999999999999999999999’ не является допустимым значением
тип атома ‘xs: десятичный’. в /path/schema.xsd в строке X

Ошибка 1717:

Элемент ‘{http://www.w3.org/2001/XMLSchema} maxInclusive ‘: значение
«9999999999999999999999999» фасета не проверяется
по отношению к базовому типу ‘{http://www.w3.org/2001/XMLSchema}десятичный’. в
/path/schema.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>

Недопустимая схема: 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

3

Решение

В соответствии с Схема W3C XML, часть 2: типы данных, второе издание, libxml2 может ограничивать диапазон maxInclusive потому что разрешено ограничивать диапазон пространства значений xs:decimal

4.3.7 maxInclusive:

[Определение:] maxInclusive является включающей верхней границей
· Пространство значений · для типа данных со · упорядоченным · свойством. Значение
maxInclusive · Должен · находиться в · пространстве значений · базового типа ·.

3.2.3 десятичный

Примечание: все · минимально соответствующие · процессоры · должны · поддерживать десятичную
числа с минимум 18 десятичными цифрами (т. е. с
· Всего цифр · из 18). Тем не менее, · минимально соответствующие · процессоры · могут ·
установить определенный приложением лимит на максимальное количество знаков после запятой
цифры, которые они готовы поддержать, и в этом случае
определенное приложением максимальное количество · должно · быть четко задокументировано.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]