Как извлечь любой текст, предшествующий определенному узлу, используя XPath 1.0?

xml xpath xpath-1.0

123 просмотра

1 ответ

Мне нужно одно выражение XPath, чтобы выделить любой текст, предшествующий узлу, независимо от структуры и иерархии. Например, как извлечь текст перед узлом <target/>в следующих случаях:

Дело 1:

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

Ожидаемый результат: 2

Случай 2:

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

Ожидаемый результат: 2

Случай 3:

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

Ожидаемый результат: «дочерний текст» или «текстовый дочерний текст»

Дело 4:

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

Ожидаемый результат: 'tail', 'text tail' или 'text child text tail'

И так далее, таких случаев может быть как можно больше. На самом деле все, что я хочу, это последний символ предыдущего текста, поэтому не имеет значения, содержит ли результат текст из любых вложенных промежуточных дочерних элементов.

Автор: Cuder Источник Размещён: 30.09.2019 12:54

Ответы (1)


3 плюса

Решение
//target/preceding::text()[normalize-space(.) != ''][1]

[1] вместо [last ()], так как предыдущие упорядочивают узлы в обратном направлении. И [normalize-space (.)! = ''], Потому что нам не нужны текстовые узлы, состоящие только из пробелов.

Автор: Björn Tantau Размещён: 20.07.2017 02:40
Вопросы из категории :
32x32