如何通过XSD redefine为已有类型追加允许的pattern且不修改基础XSD
问题原因
当前写法是对原有TenantId类型做限制性派生,XSD中如果多个pattern规则出现在派生链上,默认是同时满足的逻辑(即逻辑AND)。{Settings:Something}这类字符串包含{、}等字符,不符合base.xsd中[A-Za-z0-9\.]{3,62}的匹配规则,自然会校验失败。
要实现追加允许规则的需求(满足原有规则或新规则即可),需要用联合类型xs:union实现。
解决方案
直接修改extension.xsd为如下内容即可,无需改动base.xsd:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:redefine schemaLocation="./base.xsd"> <xs:simpleType name="TenantId"> <!-- 联合类型:只要满足其中一个成员类型的规则即可通过校验 --> <xs:union memberTypes="TenantId"> <!-- 新增允许的pattern规则 --> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\{Settings:.*\}" /> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType> </xs:redefine> </xs:schema>
修改后两种格式的取值都可以通过校验:
- 原有base.xsd定义的3-62位字母、数字、英文点组合的格式
- 新增的
{Settings:xxx}格式
可选补充
如果需要新增的{Settings:xxx}格式也满足原有3-62位长度的要求,只需要在新增的匿名简单类型中补充长度限制即可:
<xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\{Settings:.*\}" /> <xs:minLength value="3" /> <xs:maxLength value="62" /> </xs:restriction> </xs:simpleType>
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

