[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Node-sets using <xsl:with-param>

Subject: RE: Node-sets using <xsl:with-param>
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Thu, 22 Jan 2004 20:23:56 -0000
xsl param node
Your recursive call on the template with mode=modify

              <xsl:apply-templates mode="modify">
>                  <xsl:with-param name="id1" 
> select="$newid"></xsl:with-param>
>              </xsl:apply-templates>

does not set the $curnode parameter. This means it will take its default
value, which is a zero-length string. Doing an apply-templates on a
zero-length string will give you a type error.

Michael Kay

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Mir Farooq Ali
> Sent: 22 January 2004 17:11
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re:  Node-sets using <xsl:with-param>
> 
> 
> 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
> 


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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.