自定义 XSD 接受日期或日期时间的简单类型

Custom XSD simple type to accept date or dateTime

我有一个 XML 元素

<ManufactureDate>20150316</ManufactureDate>

使用自定义日期类型元素,

<xs:simpleType name="CustomDate">
    <xs:restriction base="xs:string">
       <xs:maxLength value="8"/>
       <xs:whiteSpace value="collapse"/>
       <xs:pattern value="\d*"/>
    </xs:restriction>
/xs:simpleType>

用于验证,但现在我希望另一个元素具有相同的 CustomDate 数据类型,但要提供如下所示的带时间的输入

<ExpirationDate>20150316T15:53:00</ExpirationDate>

有谁知道如何更改 simpleType 以接受两种格式?

一种可能的方法是根据您的 CustomDate 类型定义为随时间附带的自定义日期创建另一个 simpleType

<xs:simpleType name="CustomDateTime">
    <xs:restriction base="xs:string">
       <xs:maxLength value="17"/>
       <xs:whiteSpace value="collapse"/>
       <xs:pattern value="\d*T\d\d:\d\d:\d\d"/>
    </xs:restriction>
</xs:simpleType>

然后您可以使用 xs:union 接受两种自定义类型,如下所示:

<xs:simpleType name="CustomDateOrDateTime">
     <xs:union memberTypes="CustomDate CustomDateTime"/>
</xs:simpleType>

您可以采用其他几种方法,f.e 更改正则表达式模式以接受带时间和不带时间的日期。虽然,我不知道确切的要求,即是否可以接受或不接受更改 maxLength 限制等

我喜欢@har07 使用 xs:union 的想法,但是如果你真的想直接修改现有的 CustomDate 以接受可选的时间组件,你可以使用这个:

<xs:simpleType name="CustomDate">
  <xs:restriction base="xs:string">
    <xs:whiteSpace value="collapse"/>
    <xs:pattern value="\d{8}(T\d\d(:\d\d){2})?"/>
  </xs:restriction>
</xs:simpleType>

请注意,这些基于正则表达式的约束仅在词汇上近似于日期和时间数据类型。例如,xs:date 将禁止大于 12 的月份,这些模式将接受它们。

感谢大家的回复。我可以通过改变模式来解决这个问题。

我只是用 <xs:pattern value="(\d*)|(\d*T\d{2}:\d{2}:\d{2})"/> 让它工作。

它之前对我不起作用,因为我之前错过了括号。

谢谢

作为对@har07 提出的解决方案的补充,我将提出以下建议:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xml:lang="DA">
  <xs:element name="myDateTime" type="CustomDateTime" />
  <xs:simpleType name="DateType">
    <xs:restriction base="xs:date" >
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="DateTimeType">
    <xs:restriction base="xs:dateTime" >
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="CustomDateTime">
    <xs:union memberTypes="DateType DateTimeType"/>
  </xs:simpleType>
</xs:schema>

它使用标准的 XSD 日期和日期时间格式,我怀疑这是最标准的做法,而不是发明一种新格式。我什至认为这应该可行:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xml:lang="DA">
  <xs:element name="SlutDato" type="CustomDateTime" />
  <xs:simpleType name="CustomDateTime">
    <xs:union memberTypes="xs:dateTime xs:date"/>
  </xs:simpleType>
</xs:schema>