XSD:日期元素为空或符合限制

时间:2015-09-10 19:55:55

标签: xml xsd schema

我有一个XSD,我需要一个日期元素为空或者在特定日期之后(2015年10月10日)。

因此,应允许以下内容:

<DDate></DDate>
<DDate>2015-10-10</DDate>

我的XSD定义为:

<xs:element name = "DDate" nillable="true" >
    <xs:simpleType>
        <xs:restriction base="xs:date">
            <xs:minInclusive value="2015-10-01"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

这会强制日期正确,但不允许日期为空。任何见解或建议将不胜感激。

2 个答案:

答案 0 :(得分:3)

您的定义已经允许空DDate,除了一个限制外,您还必须指定xsi:nil="true",如下所示:

<!-- ns decl. should go to the root element -->
<DDate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="xsd-date-empty.xsd" 
    xsi:nil="true" />

但是,如果使用&#34;允许为空&#34;,则表示您希望在不使用xsi:nil的情况下允许空格和/或空节点,有很多方法可以做到这一点。我可能会选择一个工会,就像这样:

<xs:element name = "DDate" nillable="true" >
    <xs:simpleType>
        <xs:union>
            <xs:simpleType>
                <xs:restriction base="xs:date">
                    <xs:minInclusive value="2015-10-01"/>
                </xs:restriction>        
            </xs:simpleType>            
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:whiteSpace value="collapse" />
                    <xs:length value="0" />
                </xs:restriction>        
            </xs:simpleType>            
        </xs:union>
    </xs:simpleType>
</xs:element>

这意味着只允许a:

  • 与minInclusive限制的日期
  • 在空格折叠后为空的字符串

答案 1 :(得分:2)

一般来说,允许&#34; X或什么都没有&#34;在元素中,您有三个选项:

(a)声明元素可以为零。但这需要实例具有属性xsi:nil =&#39; true&#39;。我讨厌这种方法,从不使用它,但我提到它是完整的。

(b)将类型声明为X的并集和约束为长度为零的字符串。 (正如亚伯所说)

(c)将类型声明为带有maxLength 1的X列表。这往往是我自己的偏好。

(b)和(c)之间的选择可能取决于您如何使用架构。如果只是为了验证,两者都同样有效。如果它适用于模式感知的XSLT和XQuery处理,则列表类型效果更好,尽管3.0版本中的联合开始得到很好的支持。如果它用于Java或C#中的数据绑定,那么您将不得不问别人,这不是我的区域。