Re: [xsl] A sequence of more than one item is not allowed as the [nth] argument of [function]

Subject: Re: [xsl] A sequence of more than one item is not allowed as the [nth] argument of [function]
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Sun, 6 Mar 2005 22:16:54 +1100
This is well explained in Mike's book, page 126 - 129.

Running an XSLT 2.0 processor in backwards-compatibility mode is not
the same as running an XSLT 1.0 processor.

This is due to the fact that some parts of the stylesheet may will
generally use 2.0 facilities while others will have specified
backwards compatibility (version="1.0").

This means that the data model to be used cannot be the 1.0 data model
-- therefore the 2.0 data model is used.

So, running this transformation with Saxon 8.3:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
 >
  <xsl:output method="text"/>
  
 <xsl:template match="/">
   <xsl:value-of select="1 to 5" version="1.0"/>
 </xsl:template>
</xsl:stylesheet>

produces the result:
   1

according to the rules of XPath 1.0 and there's no error due to a
sequence of xs:decimal (an unknown type for XPath 1.0) being specified
in the "select" attribute.


Running this transformation:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
 >
  <xsl:output method="text"/>
  
 <xsl:template match="/">
   <xsl:value-of select="1 to 5"/>
 </xsl:template>
</xsl:stylesheet>

produces this result:
   1 2 3 4 5
as this is "pure XSLT 2.0"

However, I cannot understand the result of running this transformation
with Saxon 8.3:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
 >
  <xsl:output method="text"/>
 <xsl:template match="/">
   <xsl:value-of select="1 to 5" version="1.0" separator=", "/>
 </xsl:template>
</xsl:stylesheet>

The version specified is "1.0" and one would expect the single result "1"

However, the result is:
    1, 2, 3, 4, 5

Probably this is just a bug, or are the rules more complex than I thought?


Cheers,
Dimitre Novatchev.



On Sat, 5 Mar 2005 21:16:31 -0800 (PST), Mukul Gandhi
<mukul_gandhi@xxxxxxxxx> wrote:
> Hello Mr. Kay,
> 
> You are saying..
> "With XSLT 1.0, and with a 2.0 processor in 1.0 mode,
> when you pass a sequence to concat() or string() it
> will use the first item in the sequence and ignore the
> rest".
> 
> IMHO, in XSLT 1.0 mode using sequence as argument to
> concat() or string() should give an *error*.. As
> argument of type sequence is not allowed on concat()
> and string() in XPath 1.0 ..
> 
> The new string-join() function is great!
> 
> Regards,
> Mukul
> 
> --- Michael Kay <mike@xxxxxxxxxxxx> wrote:
> >
> > With XSLT 1.0, and with a 2.0 processor in 1.0 mode,
> > when you pass a
> > sequence to concat() or string() it will use the
> > first item in the sequence
> > and ignore the rest.
> >
> > With XSLT 2.0 "we" decided that was a bad idea, so
> > it's now an error.
> >
> > The way to concatenate all the strings in a sequence
> > into a single string is
> > the new string-join() function.
> >
> > Michael Kay
> > http://www.saxonica.com/
> 
> __________________________________
> Celebrate Yahoo!'s 10th Birthday!
> Yahoo! Netrospective: 100 Moments of the Web
> http://birthday.yahoo.com/netrospective/

Current Thread