Altova Mailing List Archives>Archive Index >comp.text.xml Archive Home >Recent entries >Thread Prev - Re: is this stylesheet valid? >Thread Next - Re: is this stylesheet valid? Re: is this stylesheet valid?To: NULL Date: 6/5/2007 11:04:00 AM "David Carlisle" <david-news@d...> wrote in message news:46608917.2000608@d...... > Andy Fish wrote: >> hi, >> >> i'm porting some xsl code from .net 1.1 to 2.0 and I have come across a >> transform which works in .net 1.1 and works in mxsml but does not work in >> .net 2.0. the stylesheet is this: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <xsl:stylesheet version="1.0" >> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> >> <xsl:template match="foo"> >> <xsl:param name="param1"/> >> <xsl:value-of select="$param1/*"/> >> <xsl:apply-templates/> >> </xsl:template> >> </xsl:stylesheet> >> >> and the input file is simply >> >> <foo /> >> >> so $param1 has no value (empty string? empty node set? I'm not sure) >> >> with .net 2.0 I get an error message Unhandled Exception: >> System.Xml.XPath.XPathException: Expression must evaluate to a node-set. >> I'm guessing this is because the default parameter value is an empty >> string. >> >> in the real stylesheet, the parameter (if it is passed in) will be a node >> set. so to make sure I don't evaluate an illegal expression, I need to be >> able to tell whether the parameter value is an empty string (i.e. >> default) or a node set. how can I achieve this? >> >> Andy >> >> > > > rather than have it default to an empty string, and then having to test > for that to avoid using the variable in path expressions, it's usually > simpler just to make it default to an empty node set, add > <xsl:param name="param1" select="/.."/> > > David > > > -- > http://dpcarlisle.blogspot.com Thanks david, that's pretty much what I ended up doing unfortunately there were quite a lot of templates with this optional parameter, although only one of them actually used the parameter. they are calling each other like this: <xsl:template match="..."> <xsl:param name="param1"/> ... <xsl:apply-templates> <xsl: with-param name="param1" select="$param1"> </xsl:template> </xsl:apply-templates/> </xsl:template > now, if any one of them gets called without a parameter, it passes in the blank parameter into the ones it calls (rather than not passing in a parameter - hence the default value does not apply), so this meant I had to put the default parameter into every one of the templates, not just the one that needed it. so as well as some way of telling whether a variable contains a node set, string or RTF, I would also like to have an option on <xsl:call-template> and <xsl:apply template> that said: if this parameter was passed in to me, pass the parameter into the next template,. otherwise don't pass in the parameter into the next template Andy | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
