9.3 XSD lexical forms
The predicates in this section translate between values and their lexical forms for XML-Schema data types. They are implementated in C to achieve the best possible performance.
- [det]xsd_number_string(?Number, ?String)
- This predicate is similar to number_string/2,
but accepts floating point numbers according to the XML syntax rather
than the Prolog syntax. In particular, XML does not require a‘0’(zero)
before and after the decimal dot and accepts the constants
NaN
andINF
. If a Prolog float is converted into a string it returns the XML canonical form. This form always has one digit before the decimal dot, at least one digit after it and an exponential component using the capitalE
. This predicate behaves as number_string/2 for integers.Throws a
syntax_error(xsd_number)
if String is given and is not a well-formed XSD number. - [det]xsd_time_string(?DateTime, ?Type, ?String)
- Serialize and deserialize the XSD date and time formats. The converion
is represented by the table below.
Prolog term Type XSD string date(Y,M,D) xsd:date YYYY-MM-DD date_time(Y,M,D,H,Mi,S) xsd:dateTime YYYY-MM-DDTHH-MM-SS date_time(Y,M,D,H,Mi,S,0) xsd:dateTime YYYY-MM-DDTHH-MM-SSZ date_time(Y,M,D,H,Mi,S,TZ) xsd:dateTime YYYY-MM-DDTHH-MM-SS[+-]HH:MM time(H,M,S) xsd:time HH:MM:SS year_month(Y,M) xsd:gYearMonth YYYY-MM month_day(M,D) xsd:gMonthDay MM-DD D xsd:gDay DD M xsd:gMonth MM Y xsd:gYear YYYY For the Prolog term all variables denote integers except for S, which represents seconds as either an integer or float. The TZ argument is the offset from UTC in seconds. The Type is written as xsd:name, but is in fact the full URI of the XSD data type, e.g.,
http://www.w3.org/2001/XMLSchema#date
. In the XSD string notation, the letters YMDHS denote digits. The notation SS is either a two-digit integer or a decimal number with two digits before the floating point, e.g.05.3
to denote 5.3 seconds.For most conversions, Type may be specified unbound and is unified with the resulting type. For ambiguous conversions, Type must be specified or an instantiation_error is raised. When converting from Prolog to XSD serialization, D, M and Y are ambiguous. When convertion from XSD serialization to Prolog, only DD and MM are ambiguous. If Type and String are both given and String is a valid XSD date/time representation but not matching Type a syntax error with the shape
syntax_error(Type)
is raised. If DateTime and Type are both given and DateTime does not satisfy Type a domain_error of the shapedomain_error(xsd_time(Type), DateTime)
is raised.The domain of numerical values is verified and a corresponding domain_error exception is raised if the domain is violated. There is no test for the existence of a date and thus
"2016-02-31"
, although non-existing is accepted as valid.