XSD多个条件

时间:2018-10-01 07:17:16

标签: xsd xsd-validation

我有一个包含以下代码的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个数字字符串直接相关的是另外四个数字,这些数字是可控制的,与年,月和日无关。这就是为什么基数是字符串的原因。

有什么想法吗?

/保罗

2 个答案:

答案 0 :(得分:0)

到目前为止,

<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年,所以有办法排除这种缺陷吗?

/保罗

答案 1 :(得分:0)

是的!解决:-)

模式部分应如下所示:

<xs:pattern value="(((189)[0-9]|(19)[0-9][0-9]|((200)[0-9]|(201)[0-8]))(0[1-9]|1[0-2])(0[1-9]|1[0-9]|2[0-9]|3[0-1]))" />

这在XML Schema 1.0中有效。也许1.1中有一个更好的解决方案?

/保罗