Подтвердить что ты не робот

В чем разница между normalize-space (.) И normalize-space (text())?

Я писал выражение XPath, и у меня была странная ошибка, которую я исправил, но в чем разница между следующими двумя выражениями XPath?

"//td[starts-with(normalize-space()),'Posted Date:')]"

и

"//td[starts-with(normalize-space(text()),'Posted Date:')]"  

В основном, что поймает первое выражение XPath? Потому что я получал много странных результатов. Итак, что делает text() в сопоставлении? Кроме того, есть ли разница, если я сказал normalize-space() и normalize-space(.)?

4b9b3361

Ответ 1

Ну, реальный вопрос: какая разница между . и text()?

. - текущий node. И если вы используете его там, где ожидается строка (т.е. Как параметр normalize-space()), то механизм автоматически преобразует node в строковое значение node, который для элемента - это все текстовые узлы в пределах элемент конкатенирован. (Потому что я предполагаю, что вопрос действительно о элементах.)

text(), с другой стороны, выбирает только текстовые узлы, которые являются прямыми дочерними элементами текущего node.

Так, например, с учетом XML:

<a>Foo
    <b>Bar</b>
  lish
</a>

и если <a> - ваш текущий node, normalize-space(.) вернет Foo Bar lish, но normalize-space(text()) завершится с ошибкой, потому что text() возвращает набор узлов из двух текстовых узлов (Foo и lish), который normalize-space() не принимает.

Чтобы сократить длинную историю, если вы хотите нормализовать весь текст внутри элемента, используйте .. Если вы хотите выбрать конкретный текст node, используйте text(), но всегда помните, что, несмотря на его имя, text() возвращает набор узлов, который автоматически преобразуется в строку, если у него есть один элемент.