Cuder
Cuder

Reputation: 163

How do I extract any text preceding a certain node using XPath 1.0?

I need a single XPath expression to select any text preceding a node, regardless of the structure and hierarchy. For example, how do I extract text before the node <target/> in the following cases:

Case 1:

<a>1</a>
<b>2</b>
<target/>

Expected result: 2

Case 2:

<p>1</p>
<do>
  <bt>2</bt>
</do>
<target/>

Expected result: 2

Case 3:

<aa>Text <b>child text</b></aa>
<target/>

Expected result: 'child text' or 'Text child text'

Case 4:

<p>Text <b>child text</b> tail</p>
<target/>

Expected result: 'tail', 'text tail' or 'text child text tail'

And so on, there can be as many cases as possible. Actually, all that I want is the last character of the preceding text, so it doesn't matter whether the result contains text from any nested intermediate child elements.

Upvotes: 3

Views: 339

Answers (1)

Bj&#246;rn Tantau
Bj&#246;rn Tantau

Reputation: 1614

//target/preceding::text()[normalize-space(.) != ''][1]

[1] instead of [last()] because preceding orders the nodes backwards. And [normalize-space(.) != ''] because we don't want text nodes consisting only of whitespace.

Upvotes: 3

Related Questions