简短的回答:xml 模式不能连接简单的数据类型。
无论如何,它可能不是您想要的:xs:gMonth
需要一个双连字符前缀(例如“--05”),并且xs:gDay
需要一个三连字符(例如“---31”)。不是我所期望的!以下是每个简单数据类型的示例。还有一些内置的组合类型:gYearMonth
等gMonthDay
。
沿着这些思路,xs:dateTime
有一个很长的定义:'-'? yyyy '-' mm '-' dd 'T' hh ':' mm ':' ss ('.' s+)? (zzzzzz)?
只能省略三个部分,因此需要yyyy-mm-ddThh:mm:ss
-您的示例<out>2012</out>
对此无效。
长答案:但是,xml 模式可以union
通过(如选择)和list
(相同类型的空格分隔列表)组合简单的数据类型。因此,您可以执行以下操作(gDay|gMonth|gYear|dateTime)*
:(不是有效的 xsd 语法,只是说明性的)。这不是有序的并且允许重复,因此例如“---31 --05 --05”是有效的。这是 xsd 语法:
$ cat catDatatypes.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="eg" type="myString_Type"/>
<xs:simpleType name="myString_Type">
<xs:list>
<xs:simpleType>
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:gDay"/>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:gMonth"/>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:gYear"/>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:dateTime"/>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:list>
</xs:simpleType>
</xs:schema>
$ xmllint --schema catDatatypes.xsd catDatatypes.xml
<eg>2012 --12 ---01 --12 ---31 --05 --05</eg>
catDatatypes.xml validates
结论:您不能以您(和我)想要的方式重用内置数据类型,而且它们看起来也不是很好。您最好自己明确定义它,就像 InfantProgrammer'Aravind 的回答一样。(或者,您可以为每个组件使用单独的属性 - 这也将使解析它的人更容易)。
为了好玩,我尝试缩短 InfantProgrammer'Aravind 的答案(尽管这是否使它更清晰是有争议的......)。它保留了上午/下午的 12 小时与没有上午/下午的 24 小时的检查(但不接受空的又名空值)。
<xs:simpleType name="CRNDATETIME2">
<xs:restriction base="xs:string">
<xs:pattern value="(0[1-9]|1[012])/(0[1-9]|[12]\d|3[01])/([12]\d{3}) ((0\d|1[012])(:[0-5]\d){2}|(0\d|1[012])(:[0-5]\d){2} [aApP][mM])"/>
</xs:restriction>
</xs:simpleType>
这是XSD 中正则表达式的简要指南;这是一个长的。
顺便说一句:原来你可以将“[1-9]”表示为“[\d-[0]]”,这是一个“字符类减法”,而不是一个范围。