xsl-list
[Top] [All Lists]

Re: Checking for instance of xs:integer

2004-10-12 08:44:19
Hi Kenneth,

...where I'm trying to detect if a variable has an integer value. The
output that I currently get is :

bash-2.05b$ java net.sf.saxon.Transform intck.xsl intck.xsl 

                                no

At first I thought that this is because the xsl:value-of that is
used to assign the value of $var/a was producing either a string or
an untypedAtomic value. However, changing the "xsl:when" to test for
xs:string and xsd:untypedAtomic didnt work either. Is there any way
to get this to work without using a schema aware processor?

The result of the expression "$var/a" is a sequence containing an <a>
element. A sequence of elements is not the same as a sequence of
atomic values. Tests such as:

  $var/a instance of element()
  $var/a instance of element(a)

will evaluate as true.

Note that when you do:

  <xsl:value-of select="xs:integer(2)" />

the value of the select attribute is the integer 2 (there's no
requirement for the explicit cast), in fact. The <xsl:value-of>
instruction creates a text node; text nodes don't have types, so
doing:

  <xsl:value-of select="xs:integer(2)" />

is actually just the same as doing:

  <xsl:text>2</xsl:text>

In:

  <xsl:element name="a">
    <xsl:value-of select="xs:integer(2)" />
  </xsl:element>

The generated <a> element doesn't have any type associated with it.
So, for example:

  $var/a instance of element(*, xs:integer)
  $var/a instance of element(a, xs:integer)
  data($var/a) instance of xs:integer

will be false. The first two test whether the <a> element is typed as
an xs:integer. The second tests whether the typed value of the <a>
element is an xs:integer.

If you want the <a> element to be typed as an integer, and therefore
its typed value to be an instance of xs:integer, you can do (for
example):

  <a xsl:type="xs:integer">2</a>

and then the above instance of tests will be true.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/



<Prev in Thread] Current Thread [Next in Thread>