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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.