[quoted text, click to view] "David Carlisle" <david-news@dcarlisle.demon.co.uk> wrote in message
news:46608917.2000608@dcarlisle.demon.co.uk...
> 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