xsl-list
[Top] [All Lists]

RE: A sequence of more than one item is not allowed as the value of item

2005-06-02 02:54:53

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




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>