- From: Bjoern Hoehrmann <derhoermi@gmx.net>
- Date: Mon, 12 Sep 2011 19:11:55 +0200
- To: "Anne van Kesteren" <annevk@opera.com>
- Cc: www-dom@w3.org
* Anne van Kesteren wrote:
>Apparently WebKit and Gecko violate the XPath specifications and return
>more than one Text node if they are adjacent. I do not really care either
>way, but I did create this wiki page to track problems with the current
>XPath specification that need to be resolved in a future version (if
>someone is ever going to write one that is):
>
> http://wiki.whatwg.org/wiki/DOM_XPath
A test case would be
var doc = new DOMParser().parseFromString("<y/>", "text/xml");
var tx1 = doc.createTextNode("foo");
var tx2 = doc.createTextNode("bar");
doc.documentElement.appendChild(tx1);
doc.documentElement.appendChild(tx2);
var res = doc.evaluate("/*/text()", doc, null, 7, null);
alert(res.snapshotLength == 1);
The requirement probably needs to be clarified. I would read it as
saying that you evaluate the expression pretending that text nodes
that have a preceding sibling that is a text node, and text nodes
that have the empty string as value, do not exist, leading to this:
var doc = new DOMParser().parseFromString("<y/>", "text/xml");
var tx1 = doc.createTextNode("");
doc.documentElement.appendChild(tx1);
var res = doc.evaluate("/*/text()", doc, null, 7, null);
alert(res.snapshotLength == 0);
or if you read the text as applying only when there multiple nodes
var doc = new DOMParser().parseFromString("<y/>", "text/xml");
var tx1 = doc.createTextNode("");
var tx2 = doc.createTextNode("bar");
doc.documentElement.appendChild(tx1);
doc.documentElement.appendChild(tx2);
var res = doc.evaluate("/*/text()", doc, null, 7, null);
alert(res.snapshotItem(0).nodeValue.length == 3);
Which quite clarly must be true but is false in Opera and Firefox.
Of course, if you pretend the nodes do not exist, then this fails:
var doc = new DOMParser().parseFromString("<y/>", "text/xml");
var tx1 = doc.createTextNode("abc");
var tx2 = doc.createTextNode("def");
doc.documentElement.appendChild(tx1);
doc.documentElement.appendChild(tx2);
var res = doc.evaluate("count(//text()[. = 'abcdef'])",
doc, null, 1, null);
alert(res.numberValue == 1);
which it does in Firefox but not in Opera. So it's a filter after
evaluation based on the XPath data model in Opera, while Firefox
treats "text()" as "text node" which is not what authors would ex-
pect. How about just fixing the bugs? Even got a test suite now.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Am Badedeich 7 · Telefon: +49(0)160/4415681 · http://www.bjoernsworld.de
25899 Dagebüll · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/
Received on Monday, 12 September 2011 17:12:20 UTC