Я хочу обрезать конечные пробелы в конце всех абзацев XHTML. Я использую Ruby с библиотекой REXML.
Скажем, у меня в действующем файле XHTML есть следующее:
<p>hello <span>world</span> a </p>
<p>Hi there </p>
<p>The End </p>
Я хочу закончить так:
<p>hello <span>world</span> a</p>
<p>Hi there</p>
<p>The End</p>
Итак, я подумал, что могу использовать XPath, чтобы получить только те текстовые узлы, которые мне нужны, а затем обрезать текст, что позволило бы мне получить то, что я хочу (предыдущее).
Я начал со следующего XPath:
//root/p/child::text()
Конечно, проблема здесь в том, что он возвращает все текстовые узлы, которые являются дочерними для всех p-тегов. Что это:
'hello '
' a '
'Hi there '
'The End '
Попытка использовать следующий XPath дает мне последний текстовый узел последнего абзаца, а не последний текстовый узел каждого абзаца, который является дочерним по отношению к корневому узлу.
//root/p/child::text()[last()]
Это только возвращает: 'The End '
Поэтому я хотел бы получить от XPath:
' a '
'Hi there '
'The End '
Могу ли я сделать это с помощью XPath? Или мне, может быть, стоит подумать об использовании регулярных выражений (это, вероятно, больше головная боль, чем XPath)?






Ваш пример сработал для меня
//p/child::text()[last()]
нет, он дает точный набор данных, который он просил. Он возвращает последний дочерний текстовый элемент каждого p (в данном случае три из них)
@nickf: Вы правы. Когда вы сказали, что это сработало, я пошел и дважды проверил. Это показывает, что проблема, по-видимому, связана с реализацией XPath в библиотеке Ruby REXML. Ну, я не скажу этого, пока не займусь дальнейшим исследованием. Может быть настройка, которую мне нужно передать в REXML (или что-то в этом роде)
Извините, я должен был упомянуть, что использую Ruby и REXML. Я ошибочно предположил, что XPath будет просто XPath.
Похоже, это ошибка в REXML.
На всякий случай, если вы не знали, в XSL есть функция normalize-space(), которая избавляет от начальных и конечных пробелов.
Спасибо за ответ. Может ли normalize-space () или аналогичная функция удалить только конечные пробелы (оставив только начальные пробелы)?
который дает только последний результат, он хочет, чтобы все они по всему документу