首页 > 解决方案 > XSD 多条件

问题描述

我有一个带有以下代码的 XML 模式:

<xs:attribute name="extension" use="required">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="((18)|(19)|(20))[0-9][0-9]((0[1-9]|1[0-2]))((0[1-9]|1[0-9]|2[0-9]|3[0-1]))" />
    </xs:restriction>
    <xs:length value="8" />
  </xs:simpleType>
</xs:attribute>

这段代码确定活着的人的出生日期是否正确。假设任何人的出生年份都以 18、19 或 20 开头。然后是任意两个数字,一个月在 01-12 之间,一天在 01-31 之间。出生日期必须包含 8 个数字才能验证。

问题是是否有任何方法可以进一步发展?例如,如果有 1809 年的出生年份,即使那个年龄的人不可能活着,它也会验证。未来一年也将验证——比如 2058 年。

我有一种方法可以像“minyear”和“maxyear”这样的字符串的前 4 个数字不能小于 $minyear 或大于 $maxyear?

我还可以补充一点,与这 8 个数字串直接相关的是另外四个数字,它们是控制数字,与年、月和日无关。这就是为什么基地是字符串。

有任何想法吗?

/保罗

标签: xsdxsd-validation

解决方案


走到这一步:

<xs:attribute name="extension" use="required">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="(([1][8][9][0-9]|[1][9][0-9][0-9]|[2][0][0-1][0-9])(0[1-9]|1[0-2]))((0[1-9]|1[0-9]|2[0-9]|3[0-1]))" />
    </xs:restriction>
    <xs:length value="8" />
  </xs:simpleType>
</xs:attribute>

这段代码将限制有效年份从 1890 年到 2019 年。唯一的问题是 2019 年将过去,除此之外它还有效。

然而,它并不是完美的,当 2020 年到来时,它会让所有年份到 2029 年都过去,那么有没有办法排除这种不完美呢?

/保罗


推荐阅读