我有一项任务是生成一个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断言是一种方式,但只是不清楚如何使用它来解决这个问题。任何建议?
答案 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;条件不适用,那么断言不施加约束。