183

Having the following XML:

<node>Text1<subnode/>text2</node> 

How do I select either the first or the second text node via XPath?

Something like this:

/node/text()[2] 

of course doesn't work because it's the merged result of every text inside the node.

2
  • 14
    You wrote: /node/text()[2] [...] doesn't work because it's the merged result of every text inside the node That's wrong: it means second text node child of node root element. The string value (concatenation of descendant text nodes) would be string(/node) Commented Feb 17, 2011 at 20:11
  • You mean that Xpath query should work? Well, I guess I have another problem somewhere else then. ;) Thanks! Commented Feb 17, 2011 at 20:16

2 Answers 2

226

Having the following XML:

<node>Text1<subnode/>text2</node> 

How do I select either the first or the second text node via XPath?

Use:

/node/text() 

This selects all text-node children of the top element (named "node") of the XML document.

/node/text()[1] 

This selects the first text-node child of the top element (named "node") of the XML document.

/node/text()[2] 

This selects the second text-node child of the top element (named "node") of the XML document.

/node/text()[someInteger] 

This selects the someInteger-th text-node child of the top element (named "node") of the XML document. It is equivalent to the following XPath expression:

/node/text()[position() = someInteger] 
Sign up to request clarification or add additional context in comments.

3 Comments

Does this work in PHP? I'm trying to loop through only text nodes, even those in-between a set of tags. The problem is that is smashing the content of multiple text nodes together, regardless of tags. Using //*[text()] anyway. /html/text() does not work.
@AaronGillion, Yes, AFAIK PHP has a correctly working XPath 1.0 evaluation. Do note that /html/text() doesn't select all text nodes in the document -- only the text nodes that are children (not descendents) of the top, html element. You probably want /html//text() . Some knowledge and understanding of XPath is typically required in order to construct XPath expressions.
Thanks. I figured out the double-slash trick a little bit ago!
33

your xpath should work . i have tested your xpath and mine in both MarkLogic and Zorba Xquery/ Xpath implementation.

Both should work.

/node/child::text()[1] - should return Text1 /node/child::text()[2] - should return text2 /node/text()[1] - should return Text1 /node/text()[2] - should return text2 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.