Как получить доступ к несостоявшемуся правилу xsd 1.1 assert во время проверки? - PullRequest
2 голосов
/ 12 февраля 2020

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

Ситуация:

У меня есть файл 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>

I ожидал (по моей наивности), что у меня будет доступ, например, к значению "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 во время проверки? Или потом? Я полностью сошел с рельсов или пропустил что-то очевидное здесь?

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

Пока, Торстен ...

1 Ответ

1 голос
/ 12 февраля 2020

Извините, что разочаровал вас. Весь рассматриваемый фрагмент 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>
...