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/