如何在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>
规则解释
- 唯一性约束:通过
xs:unique保证同一个Custom节点下,所有Entry的Key不会重复,符合常规业务逻辑。 - 必填Entry验证:
- 第一个断言确保
Abstract类型的Entry存在且Value严格等于Emsur,数量恰好为1 - 第二个断言确保
TempID类型的Entry存在且Value严格等于12345,数量恰好为1
- 第一个断言确保
- 可选Entry支持:保留了
maxOccurs="unbounded",其他任意Key的Entry可以按需添加或省略,完全满足可选需求。
兼容性说明
- 该方案依赖XSD 1.1标准,需要验证工具支持(比如Visual Studio 2019+、XMLSpy、Saxon等)。
- 如果必须兼容XSD 1.0,只能通过拆分
xs:sequence为必填Entry组和可选Entry组实现,但无法直接验证Value的固定值,需要额外业务逻辑补充,复杂度更高。
内容的提问来源于stack exchange,提问作者Bharani
相关产品推荐
相关产品推荐

