Как получить доступ к ошибочному правилу утверждения xsd 1.1 во время проверки?

Надеюсь, я не задаю глупый вопрос, но сам пока не смог найти ответ.

Ситуация:

У меня есть файл xml, который нужно проверить на XSD 1.1 (с большим количеством утверждений). Для проверки я использую эту версию xerces: org.opengis.cite.xerces:xercesImpl-xsd11:2.12-beta-r1667115.

Как неоднократно заявлялось в Stackoverflow, это единственная рабочая версия для XSD 1.1. И да, он работает идеально.

После проверки мне нужно знать каждое нарушение правила утверждения, поскольку (в моем случае использования) они только намекают на некоторые статистические проблемы, о которых впоследствии следует сообщить пользователю.

Я переписал обработчик ошибок, чтобы он собирал все случаи нарушения правил во время выполнения.

В файлах XSD правило выглядит так:

<xs:assert test="if(SVDUSCHENBADEN/@value = (2,3) and (SVOBERKOERPER/@value = 0 or SVKOPF/@value = 0 or SVINTIMBEREICH/@value = 0)) then false() else true()">
            <xs:annotation>
                <xs:appinfo>
                    <das:rule_id value="70011"/>
                    <das:rule_text value="Hinweis: Für das Datenfeld 'Duschen oder Baden einschließlich Waschen der Haare' ist [2] = 'überwiegend unselbständig' oder [3] = 'unselbständig' und für eines der Datenfelder 'Waschen des vorderen Oberkörpers','Körperpflege im Bereich des Kopfes' oder 'Waschen des Intimbereichs' ist [0] = 'selbständig' angegeben (Die Angaben können zu einer Auffälligkeit in der statistischen Plausibilitätsprüfung führen)"/>
                    <das:rule_type value="WARNING"/>
                    <das:rule_fields>
                        <das:field value="SVDUSCHENBADEN"/>
                        <das:field value="SVINTIMBEREICH"/>
                        <das:field value="SVKOPF"/>
                        <das:field value="SVOBERKOERPER"/>
                    </das:rule_fields>
                </xs:appinfo>
            </xs:annotation>
        </xs:assert>

Я ожидал (по своей наивности), что у меня будет доступ, например. значение «das_rule_text» во время обработки ошибок при выполнении проверки, но я получаю только номер столбца и строки закрывающего тега, где произошла ошибка, и предустановленное сообщение об ошибке, подобное этому:

cvc-assertion: Assertion evaluation ('if(SVDUSCHENBADEN/@value = (2,3) and (SVOBERKOERPER/@value = 0 or SVKOPF/@value = 0 or SVINTIMBEREICH/@value = 0)) then false() else true()') for element 'qs_data' on schema type 'das_qs_data_type' did not succeed.

Есть ли способ прочитать содержание правила XSD во время проверки? Или потом? Я совсем запутался или пропустил что-то очевидное?

Пожалуйста, помогите мне найти правильное направление.

До свидания, Торстен...


person Torsten Löhr    schedule 12.02.2020    source источник


Ответы (1)


Извините, что разочаровал вас. Весь рассматриваемый фрагмент XSD предназначен только для документации. Он существует только для людей.

Однако можно указать определяемое пользователем сообщение об ошибке для сбоев утверждений. В Xerces через атрибут xerces:message. [Как указать пользовательское сообщение об ошибке, когда XML-схема Утверждение 1.1 возвращает «ложный» результат?]1

XSD-фрагмент

<xs:annotation>
    <xs:appinfo>
        <das:rule_id value="70011"/>
        <das:rule_text value="Hinweis: Für das Datenfeld 'Duschen oder Baden einschließlich Waschen der Haare' ist [2] = 'überwiegend unselbständig' oder [3] = 'unselbständig' und für eines der Datenfelder 'Waschen des vorderen Oberkörpers','Körperpflege im Bereich des Kopfes' oder 'Waschen des Intimbereichs' ist [0] = 'selbständig' angegeben (Die Angaben können zu einer Auffälligkeit in der statistischen Plausibilitätsprüfung führen)"/>
        <das:rule_type value="WARNING"/>
        <das:rule_fields>
            <das:field value="SVDUSCHENBADEN"/>
            <das:field value="SVINTIMBEREICH"/>
            <das:field value="SVKOPF"/>
            <das:field value="SVOBERKOERPER"/>
        </das:rule_fields>
    </xs:appinfo>
</xs:annotation>

Пользовательское сообщение об ошибке на саксонском языке

<xs:assert test="if ((count(r[DeviceCost = 0]) div count(r)) le 0.01) then true() else false()"
           saxon:message="Rule #15: Just one percent or less of the DeviceCost values could be zero"
           xpathDefaultNamespace="##targetNamespace">
    <xs:annotation>
        <xs:documentation>Rule #15</xs:documentation>
        <xs:documentation>Just one percent or less of the DeviceCost values could be zero</xs:documentation>
    </xs:annotation>
</xs:assert>
person Yitzhak Khabinsky    schedule 12.02.2020
comment
Спасибо. Это многое объясняет. Хотя меня это очень разочаровывает. Поэтому мне пришлось бы найти другой способ присвоить rule_text неудачному ‹xs:assert test=...›. - person Torsten Löhr; 13.02.2020
comment
Я обновил свой ответ, чтобы показать, как реализовать собственное собственное сообщение об ошибке как в Xerces (по ссылке), так и в проверке Saxon XSD. - person Yitzhak Khabinsky; 13.02.2020