RE: [xsl] functions and sequences

Subject: RE: [xsl] functions and sequences
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 13 Dec 2004 00:02:02 -0000
<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