“00”是 XML Schema 日期数据类型的合法月份和/或日期值吗?

Posted

技术标签:

【中文标题】“00”是 XML Schema 日期数据类型的合法月份和/或日期值吗?【英文标题】:Is "00" a legal month and/or day value for XML Schema date datatype? 【发布时间】:2013-12-29 21:56:18 【问题描述】:

我正在设计一个 XML 参考书目并考虑如何捕获发布日期。对于我正在处理的大多数作品(书籍),出版日期仅包含年份,但对于某些(期刊文章)是年和月,而对于其他(报纸文章)是年、月和日。

为简单起见,我想使用一个元素来包含所有这三个变体。研究规范(http://www.w3.org/TR/xmlschema-2/ 的附录 D.2),我发现如果我的元素是 date 数据类型,我不能只省略日期和/或月份需要它们(ISO 8601 允许您这样做的方式),因为这些表示用于不同的数据类型(分别为 gYearMonthgYear)。

但是我可以对不需要的值使用零吗?像这样:

<pubdate>2009-04-00</pubdate>
<pubdate>2007-00-00</pubdate>

规范明确禁止将“0000”作为年份值(附录 D.3),但没有以任何方式说明月份和日期为零。

我怀疑我的问题的答案是否定的,因为 date 值应该对应于正好一天的时间间隔(规范第 3.2.9 节)。但我仍然想问,既要确保我不会不必要地放弃有效的方法,而且因为我还没有看到其他地方解决过这个确切的问题。

我找到的最接近的是:http://www.biglist.com/lists/xsl-list/archives/200408/msg00297.html。提出的一种解决方案是为日期的每个部分创建一个属性,如果我不能像上面建议的那样使用零,我最终可能会这样做。当然,我们欢迎更好的想法。

【问题讨论】:

【参考方案1】:

不,00 不是每个 xsd:date 的月或日的合法值;您列出的示例

<pubdate>2009-04-00</pubdate>
<pubdate>2007-00-00</pubdate>

无效。

观察 #1:

您提到使用属性。我假设您的意思不是将整个日期字符串放在属性而不是元素中,因为两者的打字问题是相同的。无论哪种方式,您都可以定义一个允许省略月份和日期的新类型(这比允许00 更可取)。

观察 #2:

日期可能非常混乱,尤其是当来源是不受控制的旧数据时。您可能希望尽可能使用带有可选组件的月份和日期规范化为严格格式,但也支持原始日期的不受约束的文本捕获,以用于由于数据不完整或不明确而无法进行规范化的情况。源自不受约束的用户输入或 OCR 的日期可能很难硬塞到标准格式中。

【讨论】:

谢谢你,KJ。您在观察#1 中的假设是正确的;我已经改写了我的问题的那一部分以澄清它(将“将日期放入属性”更改为“为日期的每个部分创建一个属性”)。【参考方案2】:

您可以使用成员类型 (xs:date, xs:gYearMonth, xs:gYear) 定义联合类型,这将允许您使用诸如

之类的值
<pubdate>2013-12-12</pubdate>
<pubdate>2009-04</pubdate>
<pubdate>2007</pubdate>

【讨论】:

迈克尔,我无法想象为什么我从未对此发表评论,因为这正是我想要的。对不起,谢谢!

以上是关于“00”是 XML Schema 日期数据类型的合法月份和/或日期值吗?的主要内容,如果未能解决你的问题,请参考以下文章

XML_04_XML Schema

XML Schema格式的"日期型数据”数据库存取

schema.xml的配置

xml schema数据类型

xml的schema约束(Java)

XML之schema