关于xml:如何使用XPath 1.0提取某个节点之前的任何文本?

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

我需要一个XPath表达式来选择节点之前的任何文本,而不管其结构和层次结构如何。
例如,在以下情况下如何提取节点<target/>之前的文本:

情况1:

1
2
3
1
2
<target/>

预期结果:2

情况2:

1
2
3
4
5
<p>1</p>
<do>
  <bt>2</bt>
</do>
<target/>

预期结果:2

情况3:

1
2
Text child text</aa>
<target/>

预期结果:"子文本"或"文本子文本"

情况4:

1
2
<p>Text child text tail</p>
<target/>

预期结果:" tail"," text tail"或" text child text tail"

依此类推,可能有尽可能多的情况。
实际上,我想要的只是前面文本的最后一个字符,因此结果是否包含来自任何嵌套中间子元素的文本都没有关系。


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

[1]而不是[last()],因为前一个命令将节点向后排序。
还有[normalize-space(。)!= \\'\\'],因为我们不希望仅由空格组成的文本节点。