XSD 限定(Facets)最全实用总结
—— 真正 99% 项目里用到的全部 12 个 Facet,一眼看懂 + 直接复制
Facets 就是“对简单类型(simpleType)再加约束”的工具。
所有 Facet 只能用在 <xs:restriction> 里面。
| Facet(限定词) | 作用 | 适用类型 | 最典型业务场景 + 示例 |
|---|---|---|---|
| length | 固定长度 | string、binary | 身份证 18 位、手机号 11 位<xs:length value="11"/> |
| minLength / maxLength | 最小/最大长度 | string、list、binary | 密码至少 8 位、备注最多 500 字<xs:minLength value="8"/> |
| pattern | 正则表达式(最强大!) | 几乎所有简单类型 | 手机号、邮箱、邮编、身份证、订单号<xs:pattern value="[0-9]{11}"/> |
| enumeration | 枚举值(状态码必备) | string、int、decimal 等 | 性别、订单状态、支付方式<xs:enumeration value="MALE"/> |
| whiteSpace | 空白处理方式 | string | 几乎都写 collapse(去首尾、连续空格变一个)<xs:whiteSpace value="collapse"/> |
| maxInclusive | ≤ 某个值(包含等于) | 数值、日期 | 金额 ≤ 999999.99<xs:maxInclusive value="999999.99"/> |
| minInclusive | ≥ 某个值 | 数值、日期 | 年龄 ≥ 18<xs:minInclusive value="18"/> |
| maxExclusive | < 某个值(不包含等于) | 数值、日期 | 折扣率 < 1(100%)<xs:maxExclusive value="1"/> |
| minExclusive | > 某个值 | 数值、日期 | 页码 > 0<xs:minExclusive value="0"/> |
| totalDigits | 整数位+小数位总数 | decimal | 金额总共最多 12 位<xs:totalDigits value="12"/> |
| fractionDigits | 小数位最多几位(最重要!) | decimal | 金额保留 2 位小数<xs:fractionDigits value="2"/> |
| assert (XSD 1.1) | 跨字段复杂约束(了解即可) | 任意 | 结束时间必须大于开始时间(极少工具支持) |
真实项目中最常用的 10 个“黄金组合”(直接复制)
<!-- 1. 中国手机号 -->
<xs:simpleType name="MobileType">
<xs:restriction base="xs:string">
<xs:length value="11"/>
<xs:pattern value="1[3-9]\d{9}"/>
</xs:restriction>
</xs:simpleType>
<!-- 2. 金额(¥0.00 ~ ¥99999999.99) -->
<xs:simpleType name="MoneyType">
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="2"/>
<xs:totalDigits value="10"/>
<xs:minInclusive value="0"/>
<xs:maxInclusive value="99999999.99"/>
</xs:restriction>
</xs:simpleType>
<!-- 3. 订单状态枚举 -->
<xs:simpleType name="OrderStatusType">
<xs:restriction base="xs:string">
<xs:enumeration value="PENDING"/>
<xs:enumeration value="PAID"/>
<xs:enumeration value="SHIPPED"/>
<xs:enumeration value="COMPLETED"/>
<xs:enumeration value="CANCELLED"/>
</xs:restriction>
</xs:simpleType>
<!-- 4. 百分比(0.00% ~ 100.00%) -->
<xs:simpleType name="PercentType">
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="2"/>
<xs:minInclusive value="0"/>
<xs:maxExclusive value="100"/>
</xs:restriction>
</xs:simpleType>
<!-- 5. 身份证号 -->
<xs:simpleType name="IdCardType">
<xs:restriction base="xs:string">
<xs:length value="18"/>
<xs:pattern value="[1-9]\d{16}(\d|X|x)"/>
</xs:restriction>
</xs:simpleType>
<!-- 6. 密码(8~20位,必须含大小写+数字) -->
<xs:simpleType name="PasswordType">
<xs:restriction base="xs:string">
<xs:minLength value="8"/>
<xs:maxLength value="20"/>
<xs:pattern value="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,20}$"/>
</xs:restriction>
</xs:simpleType>
一句话总结 Facets 使用顺序(永远这样写就对)
<xs:restriction base="xs:xxx">
<xs:whiteSpace value="collapse"/> <!-- 字符串几乎都先写这一行 -->
<xs:length value="..."/> <!-- 固定长度 -->
<xs:minLength value="..."/>
<xs:maxLength value="..."/>
<xs:pattern value="正则"/>
<xs:enumeration value="..."/> <!-- 可以写多个 -->
<xs:minInclusive value="..."/>
<xs:maxInclusive value="..."/>
<xs:totalDigits value="..."/>
<xs:fractionDigits value="2"/> <!-- 金额必写 -->
</xs:restriction>
记住:
pattern + enumeration + fractionDigits + length/minLength 这四个 Facet 能解决你 95% 的数据校验需求!
需要我直接给你生成某个业务的完整 Facets 限制(比如用户、商品、支付、物流单号),直接告诉我字段名和规则就行~