Условие утверждения ложно с Xerces, но верно с саксонским - PullRequest
0 голосов
/ 25 марта 2019

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

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

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

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

Имеет проблемы с реализацией Xerces с таким конкретным предложением assert

<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.

1 Ответ

0 голосов
/ 25 марта 2019

Вы не предоставили нам достаточно информации для полного изучения этого вопроса, но вы даете процессору сложную работу с выражением $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(.)) ..."/>
...