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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] A sequence of more than one i, Andrew Welch | Thread | RE: [xsl] A sequence of more than o, Andrew Welch |
[xsl] A sequence of more than one i, Andrew Welch | Date | RE: [xsl] A sequence of more than o, Andrew Welch |
Month |