Xpath: первая буква / строка, следующая сразу за элементом - PullRequest
2 голосов
/ 09 ноября 2019

У меня есть следующие возможности XML:

<metamark/><anything>. <anything2>bla</anything2>.</anything>
<metamark/>.<anything> <anything2>bla</anything2>.</anything>
<metamark/><anything><anything2>bla</anything2>.</anything>

Я хочу получить первое "."Итак, я попытался:

starts-with(metamark[not(descendant::text())]/following-sibling::text()[1],'.')

Работает нормально для строки 2 выше, но я пропускаю строку 1. Итак, я сделал:

starts-with(metamark[not(descendant::text())]/following-sibling::text()[1],'.') or starts-with(metamark[not(descendant::text())]/following-sibling::*[1]/text()[1],'.')

, которая теперь работает для всех строк выше. Однако строка 3 не должна быть истинной, потому что я хочу только "."которые либо следуют сразу за пустой <metamark/>, либо первой строкой непосредственно следующего за родным братом, НО, если нет текста в каком-либо элементе-потомке этого родного брата перед знаком "."

Итак, простыми словами:первый текст (как в ближайшем к фактическому закрытию «>» после элемента. Как бы я этого достиг?

1 Ответ

2 голосов
/ 09 ноября 2019

Как насчет: "Первый текстовый узел, следующий за любым <metamark>, если он начинается с '.'"

//metamark[not(descendant::text())]/following::text()[1][starts-with(., '.')]

В

<r>
  <metamark/><anything>. yes1<anything2>bla</anything2>. no1</anything>
  <metamark/>. yes2<anything> <anything2>bla</anything2>. no2</anything>
  <metamark/><anything><anything2>bla</anything2>. no3</anything>
</r>

это возвращает

'. yes1'
'. yes2'

Ось following:: игнорирует вложение, что полезно для этой задачи.

...