|
Subject: Re: [xsl] functions and sequences From: Dimtre Novatchev <dnovatchev@xxxxxxxxx> Date: Mon, 13 Dec 2004 11:14:51 +1100 |
I've also run into this issue.
While it is perfectly understandable, it is a major change from
XSLT/XPath 1.0 where it was not allowed to have two immediate
text-node siblings.
Now we have sequences and we can have a sequence of text nodes.
I think it would be good to support the following in order to avoid
inconvenience and confusion:
- Allow an xs:string() constructor, which takes a sequence of
xs:strings or a sequence of text nodes; This will allow a function of
type xs:string to automatically convert a sequence of
strings/text-nodes to a single string return value.
- Provide an overload of the concat() function, which takes a
single argument of type sequence of xs:string or sequence of text
nodes.
Cheers,
Dimitre.
On Mon, 13 Dec 2004 00:02:02 -0000, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> <xsl:text> constructs a text node; if you have several <xsl:text> and/or
> <xsl:value-of> instructions in your function, then the result of the
> function is a sequence of text nodes. A sequence of text nodes can't be
> automatically converted to a string.
>
> One solution is to generate the output using XPath expressions instead:
>
> <xsl:sequence select="
> if ($bibref/mods:relatedItem/@type = 'host')
> then concat('article-', $bibref/mods:relatedItem/mods:genre)
> else ....
> "/>
>
> Another solution is to wrap the various xsl:text and xsl:value-of
> instructions in a containing <xsl:value-of>
>
> <xsl:value-of>
> <xsl:choose>
> ...
> </xsl:choose>
> </xsl:value-of>
>
> This way the function returns a single text node, which is automatically
> converted to a single string if the declared return type is xs:string.
>
> Michael Kay
> http://www.saxonica.com/
>
>
>
> > -----Original Message-----
> > From: Bruce D'Arcus [mailto:bdarcus@xxxxxxxxxxxxx]
> > Sent: 12 December 2004 23:09
> > To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: [xsl] functions and sequences
> >
> > I've run across this issue in a different context, but can't
> > figure out
> > how to apply it here.
> >
> > I have this function (within a large stylesheet). It works if I
> > comment out the two lines indicated with the comments, but I get a "E
> > net.sf.saxon.xpath.DynamicError: A sequence of more than one item is
> > not allowed as the result of function bib:reftype()" error
> > otherwise.
> > Is there some way to get this to work? I'm not really sure
> > how much of
> > the related code I need to show to have this make any sense!
> >
> > <xsl:function name="bib:reftype" as="xs:string">
> > <xsl:param name="bibref" as="element(mods:mods)?"/>
> > <xsl:choose>
> > <xsl:when test="$bibref/mods:relatedItem/@type = 'host'">
> > <xsl:variable name="issuance"
> > select="$bibref/mods:relatedItem/mods:originInfo/mods:issuance"/>
> > <xsl:choose>
> > <xsl:when test="bib:refclass($bibref) = 'part-inSerial'">
> > <xsl:text>article</xsl:text>
> > <!-- this code introduces a sequence error;
> > don't know why
> > -->
> > <xsl:text>-</xsl:text>
> > <xsl:value-of
> > select="$bibref/mods:relatedItem/mods:genre"/>
> > </xsl:when>
> > <xsl:when test="bib:refclass($bibref) =
> > 'part-inMonograph'">
> > <xsl:choose>
> > <xsl:when test="$bibref/mods:genre">
> > <xsl:value-of select="$bibref/mods:genre"/>
> > </xsl:when>
> > <xsl:otherwise>
> > <xsl:text>chapter</xsl:text>
> > </xsl:otherwise>
> > </xsl:choose>
> > </xsl:when>
> > <xsl:otherwise>
> > <xsl:value-of select="$bibref/mods:genre"/>
> > </xsl:otherwise>
> > </xsl:choose>
> > </xsl:when>
> > <xsl:otherwise>book</xsl:otherwise>
> > </xsl:choose>
> > </xsl:function>
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] functions and sequences, Michael Kay | Thread | RE: [xsl] functions and sequences, Michael Kay |
| RE: [xsl] functions and sequences, Michael Kay | Date | RE: [xsl] More tutorials about XSL, Ganesh Babu Nallamot |
| Month |