Torsten Löhr
Torsten Löhr

Reputation: 131

How to access the failed xsd 1.1 assert rule during validation?

I hope I am not asking a stupid question but I was unable to find an answer myself yet.

Situation:

I have a xml file which has to be validated against an XSD 1.1 (with a lot of asserts). For the validation I use this xerces version: org.opengis.cite.xerces:xercesImpl-xsd11:2.12-beta-r1667115.

As it has been stated quite a few times on Stackoverflow, this seems to be the only working version for XSD 1.1. And yes, it works perfectly.

After the validation, I need to know every single violation of an assert rule, as (in my use case) they only hint towards some statistical issues which should be reported to the user afterwards.

I rewrote the error handler to gather all the rule breaking occurences during the run.

In the XSD files a rule looks like this:

<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 was expecting (in my naivety) that I would have access to e.g. the value of "das_rule_text" during the error handling of the validation run, but I only get a column and line number of the closing tag where the error ocurred and a preset error message like this:

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.

Is there a way to read the contens of the XSD rule during validation ? Or afterwards ? Am I completely off the rails or do I miss something obvious here ?

Please, help me to find the right direction.

Bye, Torsten...

Upvotes: 2

Views: 713

Answers (1)

Yitzhak Khabinsky
Yitzhak Khabinsky

Reputation: 22157

Sorry to disappoint you. The entire XSD fragment in question is for documentation purpose only. It exists for humans only.

It is however possible to, specify an user-defined error message for assertion failures. In Xerces via xerces:message attribute. [How to specify a user defined error message, when an XML Schema 1.1 assertion returns a 'false' result?]1

XSD fragment

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

Custom error message in Saxon

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

Upvotes: 1

Related Questions