El Lunes, 8 de Febrero de 2010, François Delyon escribió:

> No XPath 2.0 does not allow this kind of ambiguity.
> If a "Default element/type namespace" property exists in the static
> context, this URI is used for "for any unprefixed QName appearing in a
> position where an element or type name is expected."
> (but how can I reach elements without namespace? )
> 
> 
> And the RFC 5261 section 4.2.2 says more precisely:
> 
> "The prefix matching rules described previously in this section are
>     different from those required in XPath 1.0 and 2.0
>     [W3C.REC-xpath20-20070123].  In XPath 1.0, a "bar" selector always
>     locates an unqualified <bar> element.  In XPath 2.0, a "bar"
> selector
>     not only matches an unqualified <bar> element, but also matches a
>     qualified <bar> element that is in scope of a default namespace
>     declaration.
> In contrast, in this specification, a selector without
>     a prefix only matches one element, and it may match an element with
>     or without a prefix but only if the namespace it's qualified with
> (or
>     none) is an exact match."
> 
> That's clear!
> Less clear is how can I reach elements without namespace in Xpath 2.0?
> Mysterious.

I understand from the above text the following:

 <root xmlns="urn.default">
    <child />
  </root>

with Xpath 1.0 the query to get <child> must be (in Ruby Nokogiri syntax but 
hope it's clear what I mean):

  doc.xpath( "/ns:root/ns:child", {"ns"=>"urn.default"} )


With Xpath 2.0 the following would be valid:

  doc.xpath( "/root/child" )

Both "root" and "child" match the nodes into the document as "in XPath 2.0, a 
"bar" selector not only matches an unqualified <bar> element, but also matches 
a qualified <bar> element that is in scope of a default namespace 
declaration."

Am I wrong?



> I agree with Daniel, XPath 1.0 is very clear.

Yes, I also agree :)
I'm just asking it because I've found this "special addition" to Xpath in XCAP 
protocol for which I¡m developing a server and client.


> On the other hand, considering XPath and xhtml, in most cases you have
> to invent an irrelevant prefix to build correct XPath expressions.

Sure. The problem is that in XCAP sometimes a XMl document contains a 
reference to a XMl node into other XML document, i.e.:

  <external anchor="http://xcap.server.org/document.xml/~~/root/child"; />

Let's suppose that the "application default namespace" (a concept added in 
XCAP RFC 4825) is "urn.default". Then the XCAP client should parse the Xpath 
expression from the <external> node:
  "/root/child"
and should inspect such Xpath in the above document. But unfortunatelly prior 
to it the client must transform such Xpath into:
  "/ns:root/ns:child"
and then use:
  doc.xpath( "/ns:root/ns:child", {"ns"=>"urn.default"} )

This is a pain because it requires the client to parse and modifies the Xpath 
expression :(

  

> In this context, it is rather uncommon to have elements without
> namespace.

Unfortunatelly it's common in XCAP protocol and applications as the above 
example.


> Thus the XPath 2.0 rule is perhaps relevant, and
> I think that it should be easy to add the "Default element/type
> namespace" property to the xmlXPathContext; this could simplify Xpath
> expressions for xhtml.
> 
> By the way (prefix and namespace), I have a request about exslt.
> Some useful functions like exsltStrXpathCtxtRegister have been added.
> But they require a non-null prefix, which is not convenient in my case.
> 
> int
> exsltStrXpathCtxtRegister (xmlXPathContextPtr ctxt, const xmlChar
> *prefix)
> {
>      if (ctxt
>          && prefix
>          && !xmlXPathRegisterNs(ctxt,
>                                 prefix,
>                                 (const xmlChar *)
> EXSLT_STRINGS_NAMESPACE)
>          && !xmlXPathRegisterFuncNS(ctxt,
>                                     (const xmlChar *) "encode-uri",...
> 
> could be replaced with
> 
> int
> exsltStrXpathCtxtRegister (xmlXPathContextPtr ctxt, const xmlChar
> *prefix)
> {
>      if (!ctxt)return -1;
> if(prefix && xmlXPathRegisterNs(ctxt,prefix,(const xmlChar *)
> EXSLT_STRINGS_NAMESPACE))return -1;
> if(!xmlXPathRegisterFuncNS(ctxt,
>                                     (const xmlChar *) "encode-uri",...


Could this modification in libxml2 allow the "wrong" behavior I need?

Thanks a lot.




-- 
Iñaki Baz Castillo <i...@aliax.net>
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
xml@gnome.org
http://mail.gnome.org/mailman/listinfo/xml

Reply via email to