"David Carlisle" <da********@dcarlisle.demon.co.ukwrote in message
news:46**************@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 templatethat 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