xsl-list
[Top] [All Lists]

[xsl] Required item type of first argument of <function> is node(); supplied value has item type xs:string

2010-02-19 15:31:04
Hi List, thanks in advance for any help.

I'm creating a function (so using 2.0), and this function should be
generic enough to handle pretty much anything I throw at it, so I set
the param type as node(). Trouble pops up though when I call a
function such as the upper-case() xslt function on the parameter being
passed in, as it's a string now, not a node.

How can you convert a string to a text node? I put together an example
of the problem I'm having below:

<?xml version='1.0'?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
        xmlns:xsd="http://www.w3.org/2001/XMLSchema";
        xmlns:qp="http://www.qplegaleze.ca";
        exclude-result-prefixes="qp xsd">

        <xsl:function name="qp:test" as="item()*"
xmlns:functx="http://www.qplegaleze.ca";>
                <xsl:param name="n" as="node()"/>
                <xsl:choose>
                        <xsl:when test="$n/descendant-or-self::*">
                                <xsl:apply-templates select="$n" mode="test"/>
                        </xsl:when>
                        <xsl:otherwise>
                                <xsl:call-template name="doStuff">
                                        <xsl:with-param name="n" select="$n"/>
                                </xsl:call-template>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:function>
        
        <xsl:template match="*" mode="test">
                <xsl:copy>
                        <xsl:copy-of select="@*"/>
                        <xsl:apply-templates mode="test"/>
                </xsl:copy>
        </xsl:template>

        <xsl:template match="text()" mode="test">
                <xsl:call-template name="doStuff">
                        <xsl:with-param name="n" select="."/>
                </xsl:call-template>
        </xsl:template>

        <xsl:template name="doStuff">
                <xsl:param name="n"/>
                Stuff was done <xsl:value-of select="$n"/>
        </xsl:template>
                

<xsl:template match="/">
        
        <xsl:variable name="elemTest"><p>Element</p></xsl:variable>
        <xsl:variable name="attText"><p a="attribute"/></xsl:variable>
        <xsl:variable name="text">Text</xsl:variable>
        <xsl:variable name="notWorking"><xsl:value-of
select="$elemTest"/></xsl:variable>

        <xsl:sequence select="qp:test($elemTest)"/>
        <xsl:sequence select="qp:test($attText)"/>
        <xsl:sequence select="qp:test($text)"/>
        <xsl:sequence select="qp:test(upper-case($notWorking/text()))"/>
                
</xsl:template>

</xsl:stylesheet>

Thanks,

Spencer

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--