RE: [xsl] [XSLT 2.0] Checking that an element's value has the desired datatype?

Subject: RE: [xsl] [XSLT 2.0] Checking that an element's value has the desired datatype?
From: "Costello, Roger L." <costello@xxxxxxxxx>
Date: Mon, 16 Oct 2006 11:53:50 -0400
Excellent!  With this:

    matches(flt:Aircraft/flt:Altitude, '[0-9]+')

I can do datatype checking, without using XML Schemas.

This will be very handy for Schematron ...

/Roger

-----Original Message-----
From: Michael Kay [mailto:mike@xxxxxxxxxxxx]
Sent: Monday, October 16, 2006 11:47 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] [XSLT 2.0] Checking that an element's value has the
desired datatype?

If there's no schema, then the Altitude element is untyped, so applying
data() to it gives an instance of xs:untypedAtomic, not an integer.

The expression you want is

 flt:Aircraft/flt:Altitude castable as xsd:integer

which tests not whether the value is an integer, but whether conversion
to
an integer would succeed.

You could also test this with a regular expression

matches(flt:Aircraft/flt:Altitude, '[0-9]+')

(which in Saxon is probably faster, as "castable as" will tend to throw
and
then catch a Java exception in the "false" path, and throwing
exceptions is
very inefficient in Java).

Michael Kay
http://www.saxonica.com/


> -----Original Message-----
> From: Costello, Roger L. [mailto:costello@xxxxxxxxx]
> Sent: 16 October 2006 16:34
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] [XSLT 2.0] Checking that an element's value
> has the desired datatype?
>
> Hi Folks,
>
> Below is an XML document containing information about the
> Altitude of an Aircraft.
>
> I have written a stylesheet to check the Altitude's value, to
> see if it is an integer.  Below is my stylesheet.
>
> My stylesheet uses this statement:
>
>    <xsl:value-of select="data(flt:Aircraft/flt:Altitude)
> instance of xsd:integer"/>
>
> The output I get is: "false"
>
> (The output I seek is "true", as the Altitude element does
> have an integer value.)
>
> Can someone tell me the correct way to do this?
>
> Thanks!  /Roger
>
> --------------------------------------------------------------
> ---------
> ----------
> <?xml version="1.0"?>
> <Flight xmlns="http://www.aviation.org";>
>     <Aircraft>
>         <Altitude>3300</Altitude>
>     </Aircraft>
> </Flight>
> --------------------------------------------------------------
> ---------
> ----------
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>                        xmlns:flt="http://www.aviation.org";
>                        xmlns:xsd="http://www.w3.org/2001/XMLSchema";
>                        version="2.0">
>
>     <xsl:output method="html"/>
>
>     <xsl:template match="flt:Flight">
>       <html>
>         <body>
>             Check that the aircraft's altitude is an integer:
>             <xsl:value-of select="data(flt:Aircraft/flt:Altitude)
> instance of xsd:integer"/>
>         </body>
>       </html>
>     </xsl:template>
>
> </xsl:stylesheet>

Current Thread