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/