- From: Michael Kay <mhk@mhk.me.uk>
- Date: Wed, 25 Aug 2004 09:57:07 +0100
- To: "'Andreas Jacobsen'" <andreas.jacobsen@rasmus.uib.no>, <www-ql@w3.org>
In standard XPath and XQuery, you can't evaluate an XPath expression held as
a string: all expressions, including path expressions, have to be known at
compile time.
Some products have an extension function (see dyn:evaluate() at
www.exslt.org) to evaluate an expression constructed dynamically or read
from a source document. These tend to differ in the way they handle context,
e.g. namespaces and access to variables. Saxon has such an extension,
saxon:evaluate(), but it's currently available only in XSLT and not in
XQuery - this will change in the next release.
If the "expression" is limited to a single element name (a common use case
is specifying sort keys dynamically) then you can often get by with the
expression *[name()=$param] - but again there can be namespace
complications.
Michael Kay
> -----Original Message-----
> From: www-ql-request@w3.org [mailto:www-ql-request@w3.org] On
> Behalf Of Andreas Jacobsen
> Sent: 25 August 2004 08:56
> To: www-ql@w3.org
> Subject: Compare string to node path?
>
>
> Hi everyone
>
> I'm currently working on a master thesis which evolves around
> using XQuery
> as a multidatabase/multisource language. In this context I'm
> try solve the
> use of synonym element/attribute names in different
> documents. This is
> thought done by storing the paths to the synonymous
> elements/attributes in
> a xml-documents ("MDBDeclaration.xml"), and accessing these
> by a function
> (ub:mdb).There a two other xml documents that contains the data I'm
> actually trying to return to the user. These are specified
> together with
> MDBDeclaration.xml in museumCollection.xml and accessed with
> ease by Saxon)
>
> So far so good, the paths are returned as they should.
>
> I run in to trouble when I try to access the
> elements/attributes in the
> paths just extracted by the look-up function.
>
> declare namespace ub = "http://www.uib.no";
> declare function ub:mdb($globalVariPath)
> {
> for $i in
> doc("MDBDeclaration.xml")//member[refsGlobal=$globalVariPath]/path
> return $i
> };
>
> let $globalVariPath := "zip"
> for $res in collection("museumCollection.xml")
>
> where ub:mdb($globalVariPath) = local-name($res)
>
> return $res
>
> The Where clause is written in pseudo-code and does not perform as I
> intended. I've tried using ub:mdb($globalVariPath) as a
> predicate in the
> path expression(for-clause) but I don't get it to work there either
>
> Any help would be greatly appreciated.
>
> Regards
> Andreas Jacobsen
> University of Bergen, Norway
>
>
> --
> Using Opera's revolutionary e-mail client: http://www.opera.com/m2/
>
>
Received on Wednesday, 25 August 2004 08:57:40 UTC