自定义 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>
我有一个 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>