Hi Dimitre,
With Saxon 7.5 I'm getting an error on the following:
<xsl:value-of select="concat(position(), '. ', ., '
')"/>
"Type error in first argument of call to concat():
Required type is xs:string; supplied value has type xs:integer"
1. Why doesn't the XSLT processor perform an implicit cast from
integer to string? This is quite natural, as any atomic type has a
string representation and can be converted to string.
This is a good example of what I meant during my talk at XML Europe
about life getting harder for XSLT users because of the strong typing
in XPath 2.0. XPath 2.0 allows implicit casting:
1. from xdt:untypedAtomic (the type of untyped nodes) to any atomic
type
2. from any atomic type to its base type (up the atomic type
hierarchy)
3. from xs:decimal (and its subtypes) to xs:float or xs:double and
from xs:float to xs:double
As you say, it is possible to cast values of most types into a string
(exceptions are xs:QName and xs:NOTATION), but in terms of the type
hierarchy used by XPath 2.0, it is not the case that every type is
derived from xs:string. (I guess you're aware of the recent XML-Dev
discussion on this topic.) So you have to perform the casting
explicitly.
2. My current solution is to use
string(position())
Is this the best/recommended solution?
Yes. For atomic values like the integer returned by position(), it
returns the same as xs:string(position()); the latter is just longer
and requires an extra namespace declaration.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list