Условие утверждения ложно для Xerces, но верно для Saxon

Конкретное условие утверждения по-разному оценивается механизмом проверки Xerces и Saxon в редакторе Oxygenxml.

Я создал схему xsd (версия 1.1) и соответствующий тестовый файл xml, следующий за созданной схемой. XML-файл верен в соответствии с XMLSpy 2019.

Проверка тестового XML-файла вoxyxml 21.0 завершается ошибкой, если в качестве схемы проверки используется Xerces.

В то же время проверка проходит успешно, если в качестве механизма проверки используется Saxon.

Есть ли проблемы с реализацией Xerces с таким конкретным предложением утверждения

<xs:complexType>
    <xs:sequence>
        <xs:element name="scenario" type="Scenario"/>
        <xs:element name="year" type="StressYear"/>
        <xs:element name="position" type="STACreditPosition" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:assert test="every $pos in ./position satisfies not(($pos/geography lt $pos/preceding-sibling::position[1]/geography) or (($pos/geography eq $pos/preceding-sibling::position[1]/geography) and ($pos/creditAssetClass le $pos/preceding-sibling::position[1]/creditAssetClass)))"/>
</xs:complexType>

Я ожидаю, что проверка с двигателем Xerces пройдет успешно.


person AndyM    schedule 25.03.2019    source источник


Ответы (1)


Вы не предоставили нам достаточно информации для полного исследования, но вы даете процессору сложную работу с выражением $pos/geography lt ..., потому что оценка зависит от типа данных элемента geography. В спецификации сказано, что утверждение должно оцениваться с использованием типизированного значения geography (например, xs:integer, если оно так определено), но этого довольно сложно добиться, поскольку выражение оценивается до завершения проверки. Таким образом, хотя результат четко определен в соответствии со спецификацией, вы можете получить более совместимые результаты, если не будете полагаться на эту особенность спецификации и выполните явное преобразование типа:

<xs:assert test="every $pos in ./position satisfies
 not(($pos/geography/xs:integer(.) lt $pos/preceding-sibling::position[1]/geography/xs:integer(.)) ..."/>
person Michael Kay    schedule 25.03.2019