如何限制xsd中的日期gYear仅在1920-2000之间?

时间:2011-03-06 12:07:29

标签: xml xsd

我想限制用户输入(1920-2000)范围之外的年份部分。年份应介于此间隔之间,我不想限制特定日期,但我希望日期的YEAR部分位于此范围内。

我应该在XSD中做些什么?

现在我正在这样做,但它正在创建一个问题,并且XML没有正确验证。

    <xs:element name="dateOfBirth">    
     <xs:complexType>
      <xs:sequence>
        <xs:element name="Year">
        <!--Restriction applied : Year value can lie between 1920-2000-->
            <xs:simpleType>
                <xs:restriction base="xs:gYear">
                    <xs:minInclusive value="1920"/>
                    <xs:maxInclusive value="2000"/>
                </xs:restriction>       
            </xs:simpleType>
        <!--Restriction applied : Year value can lie between 1920-2000-->
    </xs:element>
    <xs:element name="-" type="xs:char"/>
            <xs:element name="Month">

        <!--Restriction applied : Month value can lie between 1-12-->
        <xs:simpleType>
            <xs:restriction base="xs:gMonth">
                <xs:minInclusive value="1"/>
                <xs:maxInclusive value="12"/>
            </xs:restriction>       
        </xs:simpleType>

        <!--Restriction applied : Month value can lie between 1-12-->
        </xs:element>
          <xs:element name="-" type="xs:char"/>     
          <xs:element name="Day">
        <!--Restriction applied : Day value can lie between 1-31-->
            <xs:simpleType>
                <xs:restriction base="xs:gDay">
                        <xs:minInclusive value="1"/>
                        <xs:maxInclusive value="31"/>
                </xs:restriction>       
            </xs:simpleType>
        <!--Restriction applied : Day value can lie between 1-31-->   
       </xs:element>
      </xs:sequence>
     </xs:complexType>
    </xs:element>

2 个答案:

答案 0 :(得分:3)

也许您需要添加基本类型的整数,如下所示:

 <xs:element name="age">
   <xs:simpleType>
     <xs:restriction base="xs:integer">
       <xs:minInclusive value="0"/>
       <xs:maxInclusive value="100"/>
     </xs:restriction>
   </xs:simpleType>
 </xs:element> 

否则你可能正在进行ascii比较而不是整数比较。

答案 1 :(得分:2)

你真的很困惑。

您对Wellens的回复表明您的实例数据的格式为<DOB>1988-01-24</DOB>。这是xs:date类型的值。该元素必须在模式中描述为一个简单类型,而不是一个复杂类型,其结构是(子)元素的序列。如果它的形式是

<DOB><year>1988</year><month>01</month><day>24</day></DOB>

然后你可以使用一个复杂类型,它的定义是一个包含gYear类型元素,gMonth类型元素和gDay类型元素的序列。但我不认为你的数据是这样的。

在尝试定义名称为“ - ”的元素时,您的困惑尤其明显。这甚至不是有效的XML元素名称,更不用说数据中出现的元素名称了。

那么,你怎么限制xs:date在1920-01-01到2000-12-31的范围内呢?答案是使用

<xs:simpleType>
  <xs:restriction base="xs:date">
    <xs:minInclusive value="1920-01-01"/>
    <xs:maxInclusive value="2000-12-31"/>
    <xs:pattern value=".{10}"/>
  </xs:restriction>
</xs:simpleType>

xs:pattern将值限制为10个字符的字符串。这可以防止附加时区,例如1920-01-01Z。