Re: [xsl] evaluate() error variable has not been declared??

Subject: Re: [xsl] evaluate() error variable has not been declared??
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Mon, 10 May 2004 21:52:34 +0100
Hi David,

> Why does the following test give error suggesting "Variable $test
> has not been declared", when it obviously has?

The reason that you're getting an error message is that you're asking
Saxon to evaluate the XPath:

  /test/$test/text()

This is illegal in XSLT 1.0, but legal in XSLT 2.0 as long as $test
evaluates to a sequence of nodes. Saxon is complaining because when it
evaluates a string as an XPath, it resets the variable bindings that
it knows about: the only variable references you can use are $p1, $p2
and so on, these being variables set by passing extra arguments to the
saxon:evaluate() function. So you could do something like:

  saxon:evaluate('/test/$p1/text()', $test)

but this won't give you what you want either, because it's asking for
the text node child of the node held by $test, which is the text node
child of the <input> element. The final result is therefore an empty
sequence.

What you want, I think, is to evaluate the XPath:

  /test/result/text()

but you want the step "result" to come from the value of the $test
variable. What you need to do is construct a string containing the
XPath you want using the concat() function:

  concat('/test/', $test, '/text()')

and then evaluate it.

By the way, there's no need to have the final step "/text()" in either
of the paths that you're using. Just setting the variable $test with
the XPath:

  /test/input

will give you the same result, and the code is a little cleaner (and
more robust in the face of mixed content, processing instructions and
comments in the XML).

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/

Current Thread