<xsl:when test="not(string-length($graph/@type) = 0)">
Here you are treating the variable $graph as a nodeset, when it is only
a string.
<xsl:template name="drawGraph">
<xsl:variable name="graph" select="." />
<xsl:param name="type">
<xsl:choose>
<xsl:when test="not(string-length($graph/@type) = 0)">
<xsl:value-of select="$graph/@type" />
</xsl:when>
<xsl:otherwise>x-y</xsl:otherwise>
</xsl:choose>
</xsl:param>
<type>
<xsl:value-of select="$type"/>
</type>
</xsl:template>
You can just drop $graph here and use @type on its own, as the current
node will always be '.'
I understand this is a fictional example, but wouldnt you just need:
<xsl:template name="drawGraph">
<xsl:choose>
<xsl:when test="string-length(@type)">
<xsl:value-of select="@type" />
</xsl:when>
<xsl:otherwise>x-y</xsl:otherwise>
</xsl:choose>
</xsl:template>
This will produce the same results as the above template.
cheers
andrew
-----Original Message-----
From: Ryan Beesley [mailto:RBeesley(_at_)computer(_dot_)org]
Sent: 14 October 2002 09:42
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Error xsl:param may not be used here
I know that this error has been addressed on this list
before, but I don't
think it has been answered in this context.
I have been working on a set of svg graphing (xslt) utilities
that I'd like
to make publically available once my senior design project is
complete, but
I've run into a slight snag. I wanted to be able to
customize different
parameters in multiple ways. Below is listed a small segment
of my xml and
xslt.
---- graph.xml ----
<?xml version="1.0" encoding="UTF-8"?>
<graph type="pie">
<!-- Graph data goes here -->
</graph>
---- graph.xslt ----
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="yes"/>
<xsl:template match="graph">
<xsl:call-template name="drawGraph">
<!-- Optional parameters to alter graph -->
<xsl:with-param name="type" select="'bar'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="drawGraph">
<xsl:variable name="graph" select="." />
<xsl:param name="type">
<xsl:choose>
<xsl:when test="not(string-length($graph/@type) = 0)">
<xsl:value-of select="$graph/@type" />
</xsl:when>
<xsl:otherwise>x-y</xsl:otherwise>
</xsl:choose>
</xsl:param>
<type>
<xsl:value-of select="$type"/>
</type>
</xsl:template>
</xsl:stylesheet>
---- output.xml ----
<?xml version="1.0" encoding="UTF-8"?>
<type>bar</type>
Although you would probibly never include a parameter in both
the calling
template and the xml data, I have included both to
demonstrate the use. The
passed template param should win however. When evaluating
this with XML
Spy, in debug mode, it works exactly as I want it too. I can
change the
value of @type either while calling the template, or directly
from the xml
data. If neither parameter was provided, the template
assumes a default.
Xalan and MSXML fail completely. If I place my params inside
the choose,
then they aren't recognized, as should be, but it doesn't
seem to like my
nested choose for the param either. I suspect that this
structure is the
source of my error: xsl:param may not be used here.
If anyone has suggestions as to how I can make this work, I'm
always eager
to learn. I believe I could use a variable to make this
work, but then I
wouldn't be able to change it from the template, right?
Ryan Beesley
Rbeesley(_at_)computer(_dot_)org
Founder, Atum Innovations
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
---
Incoming mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.394 / Virus Database: 224 - Release Date: 03/10/2002
---
Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.394 / Virus Database: 224 - Release Date: 03/10/2002
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list