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# 中的数据绑定,你将不得不问别人,那不是我的领域。
我有一个 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# 中的数据绑定,你将不得不问别人,那不是我的领域。