Subject: RE: text() & childNodes[0] of xPath
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 10 Mar 2010 07:45:59 -0000
|
One path selects the element node, the other selects its only text node
child. If an element has a single text node child, then the string-value of
the element is the same as the string-value of the text node, so the queries
have the same effect. However, if the element also contained a comment in
the middle of the text:
<price>30<!-- illegible, might be 39 -->.00</price>
then getting the string value of the element would give the right answer,
whereas using text() would give you two text nodes - chances are your code
would ignore all but the first. Even though this scenario is unlikely in
your book catalog, it is legal, and I would therefore recommend not using
the "/text()" suffix in the path - it makes your code simpler and more
robust.
Regards,
Michael Kay
http://www.saxonica.com/
http://twitter.com/michaelhkay
> -----Original Message-----
> From: Sanjaya Liyanage [mailto:sanjayacl@xxxxxxxxx]
> Sent: 10 March 2010 06:33
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: text() & childNodes[0] of xPath
>
> Hi,
> While I am going through the examples of Xpath @ w3schools
> site (http://www.w3schools.com/xpath/xpath_examples.asp ) I
> came across this doubt.
> <?xml version="1.0" encoding="ISO-8859-1"?>
>
> <bookstore>
>
> <book category="COOKING">
> <title lang="en">Everyday Italian</title>
> <author>Giada De Laurentiis</author>
> <year>2005</year>
> <price>30.00</price>
> </book>
>
> <book category="CHILDREN">
> <title lang="en">Harry Potter</title>
> <author>J K. Rowling</author>
> <year>2005</year>
> <price>29.99</price>
> </book>
>
> </bookstore>
>
> The above xml file is the resource.
>
> 1)path=/bookstore/book/price/text()
>
> and the part of the script is given below.
>
> var nodes=xml.selectNodes(path);
>
> for (i=0;i<nodes.length;i++)
> {
> document.write(nodes[i].nodeValue);
> document.write("<br />");
> }
>
> 2)path=/bookstore/book/price
>
> and the part of the script is given below.
>
> var nodes=xml.selectNodes(path);
>
> for (i=0;i<nodes.length;i++)
> {
> document.write(nodes[i].childNodes[0].nodeValue);
> document.write("<br />");
> }
> }
>
> In both the above cases the output is same.So I want to know
> whether the above two methods are same in functionality wise
> or are there any significant different between these two methods?
>
> Thanks
> Sanjaya.
|