【问题标题】:How to access the failed xsd 1.1 assert rule during validation?如何在验证期间访问失败的 xsd 1.1 断言规则?
【发布时间】:2020-05-27 21:58:46
【问题描述】:

我希望我不是在问一个愚蠢的问题,但我自己还找不到答案。

情况:

我有一个 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 规则的内容?还是之后?我是完全偏离了轨道还是我错过了一些明显的东西?

请帮我找到正确的方向。

再见,托尔斯滕...

【问题讨论】:

    标签: java xml validation xerces xsd-1.1


    【解决方案1】:

    很抱歉让您失望了。有问题的整个 XSD 片段仅用于文档目的。它只为人类而存在。

    但是,可以为断言失败指定用户定义的错误消息。在 Xerces 通过 xerces:message 属性。 [How to specify a user defined error message, when an XML Schema 1.1 assertion returns a 'false' result?]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>
    

    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>
    

    【讨论】:

    • 谢谢。这解释了很多。尽管这对我来说真的很失望。所以我必须找到另一种方法将“rule_text”分配给失败的 .
    • 我更新了我的答案,以展示如何在 Xerces(通过链接)和 Saxon XSD 验证中实现您自己的自定义错误消息。
    猜你喜欢
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多