Re: [xsl] Node-sets using <xsl:with-param>

Subject: Re: [xsl] Node-sets using <xsl:with-param>
From: Mir Farooq Ali <miali@xxxxxxxxx>
Date: Thu, 22 Jan 2004 12:10:52 -0500
G. Ken Holman wrote:

At 2004-01-22 00:26 -0500, Mir Farooq Ali wrote:

I'm getting an error when trying to pass the current node into a template using <xsl:with-param name="current" select="current()"/> or <xsl:with-param name="current" select="."/>

The place where I'm trying to access it
<xsl:apply-templates mode="structure1" select="$current"/> is where I'm getting an error message using Saxon indicating that the select attribute is expecting node and what it's getting is xs:string.


What am I doing wrong here?


I think we need more code fragments to see ... nothing strikes me as incorrect in the two snippets you've given.

If you are using <xsl:with-param/> inside of <xsl:apply-templates/> (you don't say if you are using <xsl:call-template or not) make sure you don't have any built-in templates being triggered between the processing of the two templates. If so, the built-in template will not pass the node parameter, the template with the parameter declaration will get called by the built-in template with no parameters, the default value for an empty parameter declaration is string, and you will have an empty string passed for the <xsl:apply-templates/>.

But that is just a guess based on your evidence.

I hope this helps.

......................... Ken

This is my stylesheet


<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
<xsl:strip-space elements="*" />
<xsl:output method="xml" indent="yes" />
<xsl:variable name="maindoc" select="/" />
<xsl:template match="TM">
<UI>
<STR>
<xsl:apply-templates select="T" mode="structure1" />
</STR>
</UI>
</xsl:template>
<xsl:template match="T" mode="structure1">
<xsl:variable name="id" select="@Identifier" />
<xsl:variable name="ttm" select="./Type" />
<xsl:variable name="tc" select="@Category" />
<xsl:variable name="uc" select="./Prefs/UC" />
<xsl:variable name="ups" select="./Prefs/UPS" />
<xsl:for-each select="document('lookup.xml')">
<xsl:variable name="current" select="." />
<xsl:apply-templates mode="modify" select="/TM/
TC[@name=$tc]/
TTM[@type=$ttm]/
UCM[@prefnum=$uc]/
UPS/part[@prefnum=$ups]/*">
<xsl:with-param name="id1" select="$id"/>
<xsl:with-param name="curnode" select="."/>
</xsl:apply-templates>
</xsl:for-each>
</xsl:template>
<xsl:template mode="modify" match="*">
<xsl:param name="id1"></xsl:param>
<xsl:param name="curnode"></xsl:param>
<xsl:variable name="idd" select="translate($id1,' ','_')"></xsl:variable>
<xsl:variable name="newid" select="concat($idd, position())"></xsl:variable>
<part class="{name()}" id="{$newid}">
<xsl:apply-templates mode="modify">
<xsl:with-param name="id1" select="$newid"></xsl:with-param>
</xsl:apply-templates>
<!--xsl:apply-templates mode="structure1" select="$curnode" /--> <!-----******* Error on this line here -->
</part>
</xsl:template>
<xsl:template match="Prefs|Type" mode="structure1" />
</xsl:stylesheet>


The error line is indicated above.

Ken, could you please elaborate on what the built-in template rule is for the situation above? I read the XSLT 1.0 spec, but couldn't fully understand what it says.

Thanks,

-Farooq.
--
Mir Farooq Ali

Computer Science, Virginia Tech,
Email: miali@xxxxxxxxx
Web: http://purl.org/net/farooq
--------------------------------------------
(c) 2004 Mir Farooq Ali  All rights reserved
--------------------------------------------


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list



Current Thread