[xquery-talk] Top N Most Common Mistakes

David Sewell dsewell at virginia.edu
Thu Aug 2 12:49:09 PDT 2007

There is also a common beginner's mistake deriving from a
misunderstanding of how variables work in XPath constructions. One's
instinct is to try this:

  let $xml := <foo><bar>text</bar><baz>text</baz></foo>
  for $el in ("bar", "baz")
  return $xml/$el/text()

when what they want is

  let $xml := <foo><bar>text</bar><baz>text</baz></foo>
  for $el in ("bar", "baz")
  return $xml/*[name(.) eq $el]/text()

What they're not realizing is that in the first case the variable is
being inserted in the XPath expression as a string literal rather than
as the name of an element, so they get a run-time error as a string
literal is not allowed as an intermediate step in an XPath expression.


On Thu, 2 Aug 2007, Torsten Grust wrote:

> Don,
> consider the following XQuery expression:
> 	let $x := <x/> return $x is $x
> which will return return true (`is' test for identical nodes).
> Textual substitution of <x/> for all occurrences of $x leads
> to
> 	<x/> is <x/>
> which will return false (the two constructors construct two
> distinct element nodes).  Referential transparency is lost
> (we cannot replace $x with its value without changing the
> meaning of the expression), the FP guys would say.
> There are other issues (scoping, for example) which make plain
> textual substitution of variables invalid -- concepts like bound
> and free variables come into play, then.
> Cheers,
>   --Torsten
> On Aug 2, 2007 at 16:40, Smith, Donald T. wrote with possible deletions:
> > > You still get the people who imagine that because variables are
> > flagged
> > > with a "$" sign they must work by textual substitution.
> >
> > I don't have the CS background to quite understand how variables work
> > via textual substitution and how they work some other way. I do know --
> > from reading Michael Kay's books -- that XSLT is a functional language
> > and that variables in XSLT can't be updated. I do understand quite well
> > template-based processing and recursive templates.
> >
> > If it's not too much of a digression into CS theory, could someone
> > explain this point?

David Sewell, Editorial and Technical Manager
ROTUNDA, The University of Virginia Press
PO Box 801079, Charlottesville, VA 22904-4318 USA
Courier: 310 Old Ivy Way, Suite 302, Charlottesville VA 22903
Email: dsewell at virginia.edu   Tel: +1 434 924 9973
Web: http://rotunda.upress.virginia.edu/

More information about the talk mailing list