You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XSD中依据另一个字段的取值设置指定字段为必填项

实现方案

你需要的是XSD的跨字段条件校验能力,分两种实现方式对应不同的XSD版本:

方案1:XSD 1.1 实现(推荐,逻辑最简洁)

XSD 1.1 原生支持xs:assert断言规则,可以直接实现需求。假设Invoice_Type和Matching_Credited_Invoice_Number是同一个父节点(例如Invoice_Header)下的同级字段,修改后的代码如下:

  1. 保留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>
  1. 在两个字段的共同父元素声明中添加断言规则:
<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,提问作者עוז היראני

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:27:02