[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

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

Subject: RE: 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
concatenating string xsl variable
> > 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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.