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: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 16 Oct 2006 16:47:08 +0100
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