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

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

我需要单个 XPath 表达式来 select 节点之前的任何文本,无论结构和层次如何。 例如,在以下情况下如何提取节点 <target/> 之前的文本:

案例一:

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

预期结果:2

案例二:

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

预期结果:2

案例三:

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

预期结果:'child text'或'Text child text'

案例四:

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

预期结果:'tail'、'text tail' 或 'text child text tail'

以此类推,越多越好。 实际上,我想要的只是前面文本的最后一个字符,所以结果是否包含来自任何嵌套中间子元素的文本并不重要。

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

[1] 而不是 [last()] 因为前面的节点向后排序。 而 [normalize-space(.) != ''] 因为我们不希望文本节点只包含白色 space。