RE: [xsl] text() & childNodes[0] of xPath

Subject: RE: [xsl] 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: [xsl] 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.

Current Thread