Re: [xml] XPath evaluation and namespace prefixes



On Thu, Mar 04, 2004 at 12:22:00PM -0800, John L. Clark wrote:
I am trying to evaluate an XPath expression that involves namespace
prefixes.  Just trying to use node.xpathEval('//pre:element') fails
with:

    Undefined namespace prefix
    xmlXPathEval: evaluation failed
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "/usr/lib/python2.3/site-packages/libxml2.py", line 361, in xpathEval
        res = ctxt.xpathEval(expr)
      File "/usr/lib/python2.3/site-packages/libxml2.py", line 6221, in xpathEval
        if ret is None:raise xpathError('xmlXPathEval() failed')
    libxml2.xpathError: xmlXPathEval() failed

And so I assumed that perhaps the XPath evaluation engine does not pick
up on namespaces that are in scope, and that I would have to craft an

  in scope of what ??? no there is no definition for this...

XPath evaluation context to specify my namespace prefix bindings.

  yes.

    Note: I don't know if my assumptions are correct; it is hard to find
          precise documentation on the semantics of the various API
          points of entry, and even harder when it comes to the Python
          API.  As such, corrections of any of my erroneous
          assumptions/approaches are welcome.

  The ultimate is the XPath REC
    http://www.w3.org/TR/xpath
    Introduction:
"Expression evaluation occurs with respect to a context. XSLT and XPointer specify how the context is 
determined for XPath expressions used in XSLT and XPointer respectively. The context consists of:

* a node (the context node)
* a pair of non-zero positive integers (the context position and the context size)
* a set of variable bindings
* a function library
* the set of namespace declarations in scope for the expression
"

  Which clearly means "it's not XPath business to initialize that context"


So I get started on experimenting with the xpathContext class in Python
from the command line:

    Python 2.3.2 (#1, Nov 21 2003, 14:36:46)
    [GCC 3.3.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import libxml2
    >>> doc = libxml2.parseFile('overview.xml.rdf')
    >>> xc = libxml2.xpathContext()
    >>> xc
    <libxml2.xpathContext instance at 0x40a4f30c>
    >>> xc.setContextDoc(doc)
    Segmentation fault 

  Might be a bug in Python bindings.

The same thing happens when I try to use setContextNode (with a node
instead of doc).  I am ...

  Setting the node and the document for the context node is anyway 
independant of setting the namespace declarations in scope for the expression

Can someone point me in the right direction? 

  In any doubt readingt the spec first helps disambiguating.

Is this latter problem a bug?

  Probably.

Daniel

-- 
Daniel Veillard      | Red Hat Network https://rhn.redhat.com/
veillard redhat com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]