如何在XSD中依据另一个字段的取值设置指定字段为必填项
实现方案
你需要的是XSD的跨字段条件校验能力,分两种实现方式对应不同的XSD版本:
方案1:XSD 1.1 实现(推荐,逻辑最简洁)
XSD 1.1 原生支持xs:assert断言规则,可以直接实现需求。假设Invoice_Type和Matching_Credited_Invoice_Number是同一个父节点(例如Invoice_Header)下的同级字段,修改后的代码如下:
- 保留
Matching_Credited_Invoice_Number的基础定义:
<xs:element name="Matching_Credited_Invoice_Number"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{0,10}" /> </xs:restriction> </xs:simpleType> </xs:element>
- 在两个字段的共同父元素声明中添加断言规则:
<xs:element name="Invoice_Header"> <xs:complexType> <xs:sequence> <!-- 原有其他字段 --> <xs:element name="Invoice_Type" type="xs:string"/> <xs:element ref="Matching_Credited_Invoice_Number"/> <!-- 原有其他字段 --> </xs:sequence> <!-- 新增条件校验规则 --> <xs:assert test="if (Invoice_Type = 'Credit') then string-length(Matching_Credited_Invoice_Number) > 0 else true()"/> </xs:complexType> </xs:element>
规则说明:当Invoice_Type取值为Credit时,Matching_Credited_Invoice_Number的文本长度必须大于0,其他场景不做强制非空限制
方案2:XSD 1.0 兼容实现
如果你的解析器不支持XSD 1.1,可以用xs:choice分支选择实现相同逻辑,通过不同分支定义不同的字段约束:
<xs:complexType name="Invoice_Header_Type"> <xs:choice> <!-- 分支1:Invoice_Type为Credit的场景 --> <xs:sequence> <xs:element name="Invoice_Type" fixed="Credit"/> <xs:element name="Matching_Credited_Invoice_Number"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{1,10}" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- 其他共有的字段声明 --> </xs:sequence> <!-- 分支2:Invoice_Type为其他值的场景 --> <xs:sequence> <xs:element name="Invoice_Type"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Normal"/> <xs:enumeration value="Debit"/> <!-- 补充其他允许的Invoice_Type取值,排除Credit即可 --> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="Matching_Credited_Invoice_Number"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{0,10}" /> </xs:restriction> </xs:simpleType> </xs:element> <!-- 其他共有的字段声明 --> </xs:sequence> </xs:choice> </xs:complexType>
内容的提问来源于stack exchange,提问作者עוז היראני
相关产品推荐
相关产品推荐

