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

如何在XSD中强制验证Abstract与Lot的Value属性并保留其他项可选?

调整XSD规则实现特定Entry的必填验证需求

问题场景

XML示例

<Custom>
    <Entry Key="ClientApp.DataContext.JobId" Type="String" Value="105161"></Entry>
    <Entry Key="ClientApp.DataContext.JobNumber" Type="String" Value="PCSQ test"></Entry>
    <Entry Key="Abstract" Type="String" Value="Emsur"></Entry>
    <Entry Key="TempID" Type="String" Value="12345"></Entry>
    <Entry Key="Lot" Type="String" Value="6789"></Entry>
</Custom>

Visual Studio 2019自动生成的XSD

<xs:element name="Custom">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="Entry">
                <xs:complexType>
                    <xs:attribute name="Key" type="xs:string" use="required" />
                    <xs:attribute name="Type" type="xs:string" use="required" />
                    <xs:attribute name="Value" type="xs:string" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

需求背景

自动生成的XSD将所有Entry的Key、Type、Value属性设为必填,但实际业务要求:

  • 必须存在且仅存在1个Key="Abstract"且Value="Emsur"的Entry
  • 必须存在且仅存在1个Key="TempID"且Value="12345"的Entry
  • 其他如ClientApp.DataContext.JobId这类Entry为可选项,可自由添加或省略

解决方案

使用XSD 1.1的**断言(xs:assert)**功能可以直接实现需求,同时保留原有Entry的灵活性。以下是修改后的完整XSD:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1">
    <xs:element name="Custom">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="Entry">
                    <xs:complexType>
                        <xs:attribute name="Key" type="xs:string" use="required" />
                        <xs:attribute name="Type" type="xs:string" use="required" />
                        <xs:attribute name="Value" type="xs:string" use="required" />
                    </xs:complexType>
                    <!-- 确保每个Entry的Key唯一,避免重复定义 -->
                    <xs:unique name="UniqueEntryKey">
                        <xs:selector xpath="." />
                        <xs:field xpath="@Key" />
                    </xs:unique>
                </xs:element>
            </xs:sequence>
            <!-- 验证必填Entry的存在和固定Value -->
            <xs:assert test="count(Entry[@Key='Abstract' and @Value='Emsur']) = 1" />
            <xs:assert test="count(Entry[@Key='TempID' and @Value='12345']) = 1" />
        </xs:complexType>
    </xs:element>
</xs:schema>

规则解释

  1. 唯一性约束:通过xs:unique保证同一个Custom节点下,所有Entry的Key不会重复,符合常规业务逻辑。
  2. 必填Entry验证:
    • 第一个断言确保Abstract类型的Entry存在且Value严格等于Emsur,数量恰好为1
    • 第二个断言确保TempID类型的Entry存在且Value严格等于12345,数量恰好为1
  3. 可选Entry支持:保留了maxOccurs="unbounded",其他任意Key的Entry可以按需添加或省略,完全满足可选需求。

兼容性说明

  • 该方案依赖XSD 1.1标准,需要验证工具支持(比如Visual Studio 2019+、XMLSpy、Saxon等)。
  • 如果必须兼容XSD 1.0,只能通过拆分xs:sequence为必填Entry组和可选Entry组实现,但无法直接验证Value的固定值,需要额外业务逻辑补充,复杂度更高。

内容的提问来源于stack exchange,提问作者Bharani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:54:59