Ответ 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()
возвращает набор узлов, который автоматически преобразуется в строку, если у него есть один элемент.