我的问题几乎与这个问题完全相同,但针对的是 xs:dateTime 类型而不是用户定义的元素。
我的 XML 中的一个元素(我没有创建)可能如下所示:
<parent>
...
<start>2012-01-01T00:00:00.000</start>
<end>2013-01-01T00:00:00.000</end>
...
</parent>
-或者-
<parent>
...
<start reference="a string" />
<end reference="a string" />
...
</parent>
换句话说,在父元素中,“start”和“end”字段可以包含 xs:dateTime 值,或者将为空但具有“reference”属性(任一字段可能是父元素中的一个或另一个,它们不一定都是参考或日期时间)。我尝试了各种方法在 XSD 中表示这一点,但还没有找到解决方案。我最接近的是(摘自一个更大的 XSD):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="DateOrRef">
<xs:simpleContent>
<!-- <xs:extension base="xs:dateTime"> This does not validate-->
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="reference" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="parent">
<xs:sequence>
<xs:element minOccurs="0" name="start" type="DateOrRef" />
<xs:element minOccurs="0" name="end" type="DateOrRef" />
</xs:sequence>
</xs:complexType>
</xs:schema>
它确实验证,但不将节点内容限制为 xs:dateTime 值。如果我将扩展基本类型更改为 xs:dateTime 而不是注释行中的 xs:string,则空元素将不再有效,因为 dateTime 类型不允许为空。
我如何构建 XSD 以将这些字段验证为 xs:dateTime 而不是 xs:string?