- From: Paul Warren <pdw@decisionsoft.com>
- Date: 06 Feb 2003 10:49:40 +0000
- To: Jeni Tennison <jeni@jenitennison.com>
- Cc: Hanna <lhnhanna@hotmail.com>, xmlschema-dev@w3.org
On Thu, 2003-02-06 at 10:15, Jeni Tennison wrote:
> <xs:simpleType name="mydatetype">
> <xs:restriction base="xs:token">
> <xs:pattern value="[0-9]{2}-[0-9]{2}-[0-9]{4}" />
> </xs:restriction>
> </xs:simpleType>
>
> Note that this doesn't test things like:
>
> - that the days range between 01 and 31 and the months between 01
> and 12
> - that the day that you have given for a month is valid (so you
> don't allow 31-04-2002)
> - that the day that you have given for February is valid, taking
> into account leap years (so you don't allow 29-02-2003, but do
> allow 29-02-2004)
>
> You can't test all that with a regular expression, so if you want to
> enforce valid dates you'll need to write some extra checking code.
I'm being tedious, but you can:
(?:(?:(?:[02468][048]|[13579][26])00|\d\d(?:[02468][48]|[2468][048]|
[13579][26]))02(?:0[1-9]|[12]\d)|\d{4}(?:02(?:0[1-9]|1\d|2[0-8])|(?:
(?:0[469]|11)(?:0[1-9]|[12]\d|30))|(?:0[13578]|1[02])(?:0[1-9]|[12]
\d|3[0-1])))
:-)
That uses some Perl-isms (the "(?:" notation)) which I don't think are
allowed in XML Schema, but simple brackets should do. IIRC it does
dates of the format YYYYMMDD, but it should be possible to re-jig it to
other formats. If you think that's bad, have a look at what it takes to
do email addresses [1].
Getting back to the original question, my preferred solution would be to
use the standard XML Schema type and transform upon serialisation /
deserialisation, although I appreciate that this is not answering the
question asked. This solution allows you to make use of the date
validation code built into schema validating parsers.
Paul
[1] http://www.ex-parrot.com//~pdw/Mail-RFC822-Address.html
--
Paul Warren, Client Services DecisionSoft Limited
+44-1865-203192 http://www.decisionsoft.com
Received on Thursday, 6 February 2003 05:49:44 UTC