RE: [xml] XPath / LibXML question



Hi, 

-----Original Message-----
From: Alan_McCarthy scee net [mailto:Alan_McCarthy scee net] 
Sent: Thursday, June 01, 2006 5:18 PM
To: Buchcik, Kasimier
Cc: Aron Stansvik; Buchcik, Kasimier; xml gnome org
Subject: RE: [xml] XPath / LibXML question

Well, that certainly returns just the one result correctly...

I take it from your comments about it not being optimized that it will
still find all results before returning the first, rather than just
terminating at the first match?

Although it will return just one node, it will still try to apply the
predicate "[ att2='2' and parent::instances/parent::item[ att1='1']]"
on all "instance" elements it finds in the document. So actually it will
run even slower than your original expression. I'll try to optimize
this.

But the expression I proposed (even if optimized) has the drawback that
it won't be as efficient as a plain chain of node-tests in the child
axis,
if you *don't* know if the document will be of the expected structure.
Hmm, don't know if I expressed this understandable enough; I think this
will become clearer if we assume that the given document has a document
element with the name "foo"; here my expression will still search the
whole tree for "instance" elements, while your expression would stop
already at the document element. So it all depends on how much you can
assume about the queried tree.

Another possibility would be to use a specialized Libxml2 function,
which
internally will try to return only the first match. Maybe someone else
knows if we have such a function already. But such a function won't be
much efficient, since the XPath mechanism of Libxml2 will still gather
and test all nodes up to "/base/group/item[ att1=1]/instances", and then
it will have the chance to stop at the first match of
"instance[ att2=2]".

Regards,

Kasimier


Thanks

Alan


"Buchcik, Kasimier" <k buchcik 4commerce de> wrote on 
01/06/2006 15:45:36:

Hi,

-----Original Message-----
From: xml-bounces gnome org [mailto:xml-bounces gnome org] On
Behalf Of Buchcik, Kasimier
Hi,

As Aron already pointed out, the position() should be of
help. You need to select the descendant-or-self or descendant
axis.
Your expression could look like this:
"//instance[ att2='2' and
parent::instances/parent::item[ att1='1']][1]"

Whoops, sorry this should read:
"/descendant::instance[ att2='2' and
parent::instances/parent::item[ att1='1']][1]"

Regards,

Kasimier


**********************************************************************
This email and any files transmitted with it are confidential and
intended solely for the use of the individual or entity to whom they
are addressed. If you have received this email in error please notify
postmaster scee net

This footnote also confirms that this email message has been checked
for all known viruses.

**********************************************************************
Sony Computer Entertainment Europe






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