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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] A sequence of more than o, Andrew Welch | Thread | Re: [xsl] A sequence of more than o, David Carlisle |
Re: [xsl] Ascii end-of-file charact, David Carlisle | Date | Re: [xsl] A sequence of more than o, David Carlisle |
Month |