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: "Andrew Welch" <ajwelch@xxxxxxxxxxxxxxx>
Date: Thu, 2 Jun 2005 10:54:53 +0100
> > I'd have to read the spec
>
> in particular, reading
> http://www.w3.org/TR/xslt20/#constructing-simple-content
> reveals the answer.
>
>  <xsl:variable name="foo" as="item()*">
>    <xsl:text/>abc<xsl:sequence select="'def'"/>
>  </xsl:variable>
>
> $foo is a sequence of length three.
> An empty text node
> a text node with string value "abc"
> and a string "def"
>
>
>
>  <xsl:variable name="foo2" as="item()*">
>    <xsl:text/>abc<xsl:value-of select="'def'"/>
>  </xsl:variable>
>
> $foo2 is a sequence of length three.
> An empty text node
> a text node with string value "abc"
> and a text node with string value "def"
>
>
>
>
> So what happens when you do
> <xsl:value-of select="$foo" separator=","/>
> <xsl:value-of select="$foo2" separator=","/>
>
> Well the 6 stages in the above referenced section get applied.
>
> stage 1 is dicarding zero length text nodes so now
> $foo is
> a text node with string value "abc"
> and a string "def"
>
> and $foo2 is
> a text node with string value "abc"
> and a text node with string value "def"
>
>
> stage 2 is merging adjacent text nodes so now
> $foo is
> a text node with string value "abc"
> and a string "def"
>
> and $foo2 is
> a text node with string value "abcdef"
>
>
> stage 3 converts from nodes to atomic values so now
> $foo is
> a string "abc"
> and a string "def"
>
> and $foo2 is
> a string "abcdef"
>
> stage 5 is concatenating all the sequence together, inserting
> the separator if one is supplied or a space if not, so now
>
> $foo is
> a string"abc,def"
>
> and $foo2 is
> a string"abcdef"
>
> Voila....

Indeed, the key here is that text nodes get merged together at stage 2
before the atomization at stage 3 - which is why I'm still confused if I
specify xs:string+ instead of item()+:

<xsl:variable name="foo" as="xs:string+">
	<xsl:text/>abc<xsl:sequence select="'def'"/>
</xsl:variable>

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


<xsl:value-of select="$foo" separator=","/>

Gives ,abc,def

<xsl:value-of select="$foo2" separator=","/>

Gives ,abc,def

I would have expected the same behaviour as specifying item()+ as
atomization occurs after the merging of the text nodes in $foo2

This suggests that by specifying xs:string Saxon is jumping the gun and
converting the text nodes (zero length text nodes as well - the leading
comma) to strings before stage 2.

cheers
andrew

Current Thread