XSD:日期元素为空或满足限制

XSD: Have a date element be either empty or meet restrictions

我有一个 XSD,我需要一个日期元素为空或在某个日期 (10/1/2015) 之后。

因此,应该允许以下内容:

<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>

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

您的定义已经允许空 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" />

但是,如果使用 "allow empty",你的意思是你想要允许空格,and/or 空节点而不使用 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>

这意味着仅允许:

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

通常,要在元素中允许 "X or nothing",您有以下三种选择:

(a) 声明元素可为空。但这需要实例具有属性xsi:nil='true'。我讨厌这种方法并且从不使用它,但为了完整起见我提到它。

(b) 将类型声明为 X 和长度限制为零的字符串的联合。 (正如亚伯建议的那样)

(c) 将类型声明为最大长度为 1 的 X 列表。这往往是我自己的偏好。

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