Re: [xsl] A sequence of more than one item is not allowed as the value of item

Subject: Re: [xsl] A sequence of more than one item is not allowed as the value of item
From: David Carlisle <davidc@xxxxxxxxx>
Date: Wed, 1 Jun 2005 11:46:08 +0100
> I fear this may be a FAQ...
> 

Not yet F (not enough people using 2) but it will be...


> <xsl:variable name="foo" as="xs:string">
>   <xsl:text/>abc<xsl:value-of select="'def'"/>
> </xsl:variable>
> 
> <xsl:value-of select="$foo"/>	
> 
> Gives the error message: "A sequence of more than one item is not
> allowed as the value of item $foo"
> 
> This is because variable $foo contains two strings,

beware of the difference between a text node and a string.
The content of your variable constructs a sequence of two text nodes.
It then tries to cast these to a string as that's what you specified in
the as attribute and that fails.

This would work:

 <xsl:variable name="foo" as="xs:string">
   <xsl:value-of>abc<xsl:value-of select="'def'"/></xsl:value-of>
 </xsl:variable>
 


>  yet I've defined it
> as type xs:string - which it seems refers to a single string.  If I
> define it as xs:string+ I get the separator and then need to use
> string-join().

Yes


> If I drop the as="xs:string" attribute I get the desired result 'abcdef'
> - but this is because that's the string value of the nodeset.

there are no nodesets any more. Without the as attribute you generate a
(sequence of one) document node and as the text nodes are placed as
children of this document node they are merged into a single text node
as you can't have adjacent text nodes. This document node is then cast
to a string, as you say.

> 
> This is very upside down for me.

Life's like that.

> 
> Is it really the case that we will have to be very aware of how many
> items we are creating 

Welcome to the wonderful world of strict type checking:-)
Often as not the only reason for using an as attribute is to generate an
error on code that would otherwise work as you want to trap user-errors
earlier rather than rely on implicit conversions. So if you say
as="xs:string" you are saying that you want exactly one string, so if
you give it a sequence of two things you error. This is either a good
thing or a bad thing, depending on whether, at heart, you are a lisp
programmer or a pascal one:-)


> and construct large concat()'s, or have a liberal
> sprinking string-join()'s throughout the stylesheet?  Or am I missing
> something and I shouldn't be using the type xs:string in this way?
> 
> cheers
> andrew
> 
> 


David

________________________________________________________________________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________

Current Thread