В чем разница между normalize-space (.) И normalize-space (text ())? - PullRequest
22 голосов
/ 13 мая 2011

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

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

и

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

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

1 Ответ

40 голосов
/ 13 мая 2011

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

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

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

Так, например, учитывая XML:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...