REXML XPath bug?

A

Andy Watts

I'm having trouble with a particular XPATH in REXML and would greatly
appreciate any help.

Given this simple document..
<body>
<div class="summary">xxx</div>
<div>
<span>yyy</span>
</div>
</body>

The xpath "//div[@class='summary']/following-sibling::div/span" is
failing to return '<span>yyy</span>'.


Here's a console dump that also shows a simplier xpath working.
REXML::XPath.match(doc, "//div[@class='summary']/following-sibling::div/span").to_s => ""
REXML::XPath.match(doc, "//div[@class='summary']/following-sibling::div").to_s
=> said:
puts doc.to_s
<body>
<div class='summary'>xxx</div>
<div>
<span>yyy</span>
</div>
</body>

The xpath works fine in firefox's xpath checker, so it seems like an
issue with rexml.
Any help greatly appreciated.

- Andy
 
C

Casimir

I'm having trouble with a particular XPATH in REXML and would greatly
appreciate any help.
(rest of it quoted below)

Ok, I tested this with JEdits XPATH tool and indeed, the xpath "//div
[@class='summary']/following-sibling::div" returns the span-element with
string-value yyy, xml fragment <span>yyy</span>.

Is it a bug? I must admit I would need to read more references etc before
being able to say definately - or is it just different interpretation of
the following-sibling -axis. Dont have the time to see the rfc atm.

But I played around a bit:
irb(main):046:0> puts root.elements["//div[@class='summary']/following-
sibling::div/span"]
nil
* So, it doesnt work like that.

irb(main):047:0> puts root.elements["//div[@class='summary']/following-
sibling::div"]
<div>
<span>yyy</span>
</div>
* hmm....

irb(main):049:0> puts root.elements["//div[@class='summary']/
following::div/span"]
<span>yyy</span>
** Would this work in your case?

ALSO - you could include the rexml namespace by adding the line
include REXML
after the rexml requires. This way you wont have to use the long ::-
syntax, but can refer to document or elements directly, and use xpaths
simply as above inside [""].

I also played around with this http://www.zvon.org:9001/saxon/cgi-bin/
XLab/XML/xpatut_15.html and following seems to accomplish what you need.

Finally, just plain-jane /div/span would select the span but maybe there
can be many and you only want the one after the summary div.

Out of time, gtg

Casimir Pohjanraito
Given this simple document..
<body>
<div class="summary">xxx</div>
<div>
<span>yyy</span>
</div>
</body>

The xpath "//div[@class='summary']/following-sibling::div/span" is
failing to return '<span>yyy</span>'.


Here's a console dump that also shows a simplier xpath working.
REXML::XPath.match(doc,
"//div[@class='summary']/following-sibling::div/span").to_s => ""
REXML::XPath.match(doc,
"//div[@class='summary']/following-sibling::div").to_s
=> said:
puts doc.to_s
<body>
<div class='summary'>xxx</div>
<div>
<span>yyy</span>
</div>
</body>

The xpath works fine in firefox's xpath checker, so it seems like an
issue with rexml.
Any help greatly appreciated.

- Andy
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,822
Latest member
israfaceZa

Latest Threads

Top