我有一个包含以下代码的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个数字字符串直接相关的是另外四个数字,这些数字是可控制的,与年,月和日无关。这就是为什么基数是字符串的原因。
有什么想法吗?
/保罗
答案 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中有一个更好的解决方案?
/保罗