XSD 限定 / Facets

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 限制(比如用户、商品、支付、物流单号),直接告诉我字段名和规则就行~

文章已创建 2783

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部