使用xsd 1.1断言进行范围检查

时间:2018-06-13 03:52:20

标签: xml xsd-validation

我有一项任务是生成一个XSD文件,用于验证xml文件中的渔业数据。所涉及的数据列出了钓鱼之旅中捕获的所有鱼类(包括所有细节),例如物种编码,长度,性别等。验证的第一部分是检查species_code是否有效我通过列出枚举中的所有有效sp_code并检查此列表中的sp_code来完成此检查。 下面是xml文件中的一个catch

  <CATCH>
    <CATCH_ID>1</CATCH_ID>
    <CATCH_DATE>2017-06-02T05:27:49Z</CATCH_DATE>
    <SP_CODE>ALB</SP_CODE>
    <LEN>103</LEN>
    <SEX_CODE>U</SEX_CODE>
    <LAT>-2033.126</LAT>
    <LON>+17602.598</LON>
  <CATCH>

我设法做的第一部分是检查输入的SP_CODE是否有效:

        <xs:element name="CATCH" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="SP_CODE" minOccurs="0">
                        <xs:simpleType>
                            <xs:restriction base="SP_ENUM">
                                <xs:assertion/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="LEN" type="xs:integer" minOccurs="0"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>

    <xs:simpleType name="SP_ENUM">
    <xs:restriction base="xs:string">
        <xs:enumeration value="ALB"/>
        <xs:enumeration value="ALO"/>
        <xs:enumeration value="ALX"/>
        <xs:enumeration value="BAR"/>
        <xs:enumeration value="BET"/>
    </xs:restriction>
    </xs:simpleType>

然而,还有第二部分让我的头脑变得混乱(这个xsd验证的新内容。问题取决于species_code,有一个长度范围,例如sp_code是否为BET) - 对于大眼金枪鱼然后LENGTH应该在50-200厘米范围内,否则如果SP_CODE是ALB - 对于长鳍金枪鱼,那么LENGTH应该在50-140厘米范围内等等。这是一个简单的商业规则我想在我的xsd中测试。我是做一些搜索,并告诉我xsd 1.1断言是一种方式,但只是不清楚如何使用它来解决这个问题。任何建议?

1 个答案:

答案 0 :(得分:0)

您可以选择编写一个复杂的断言或许多小断言(每个断言都必须为真)。我会使用后一种方法,因为如果断言失败,它更容易看出错误。典型的断言可能是

<xs:assert test="if (SP_CODE eq 'ALB') then (LEN ge 50) else true()"/>
<xs:assert test="if (SP_CODE eq 'ALB') then (LEN le 250) else true()"/>

这些元素应在<xs:element name="CATCH">之后显示为<xs:complexType>的子级。它们不属于SP_CODE,就像您的样本一样,因为它们不会影响有效的SP_CODE,只会影响有效的CATCH。

else true()是满足XPath语法规则所需的乏味样板。它基本上说如果&#34; if&#34;条件不适用,那么断言不施加约束。