Разница между текстом () и строкой () - PullRequest
25 голосов
/ 29 февраля 2012

Может кто-нибудь объяснить разницу между функциями text () и string (). Я часто использую одно с другим, но это не имеет никакого значения, оба получат строковое значение узла xml.

Ответы [ 2 ]

46 голосов
/ 29 февраля 2012

Может кто-нибудь объяснить разницу между text () и string () функции.

I. text() это не функция, а проверка узла .

Используется для выбора всех дочерних текстовых узлов контекстного узла.

Таким образом, если узел контекста является элементом с именем x, то text() выбирает все дочерние элементы текстового узла x.

Другие примеры :

/a/b/c/text()

выбирает все дочерние элементы текстового узла любого элемента c, который является дочерним по отношению к любому элементу b, который является дочерним по отношению к верхнему элементу a.

II. Функция string()

По определению string(exprSelectingASingleNode) возвращает строковое значение узла.

Строковое значение элемента - это объединение всех его потомков текстового узла - в порядке документа.

Следовательно, если в следующем XML-документе :

<a>
  <b>2</b>
  <c>3
    <d>4</d>
  </c>
  5
</a>

string(/a) возвращает (без кавычек):

"
  2
  3
    4

  5
"

Как мы видим, строковое значение отражает три текстовых узла только для пробелов, которые мы обычно не замечаем и не учитываем.

В некоторых синтаксических анализаторах XML есть возможность удаления текстовых узлов только для пробелов. Если указанный выше документ был проанализирован с удаленными текстовыми узлами только для пробелов, то эта же функция:

string(/a)

теперь возвращает:

"23
    4
  5
"
10 голосов
/ 29 февраля 2012

В большинстве случаев, если вам нужно содержимое узла элемента X, вы можете ссылаться на него как «.», Если это узел контекста, или как «X», если это дочерний узел узла контекста.Например:

<xsl:if test="X = 'abcd'">...

или

<xsl:value-of select="."/>

В обоих случаях, поскольку контекст требует строку, функция string() применяется автоматически.(Это небольшое упрощение, если вы используете XSLT 2.0 с поддержкой схемы, правила немного сложнее).

Использование "string()" здесь не нужно, потому что это делается автоматически;и использование text() является ошибкой (которая становится все более распространенной, поощряемой некоторыми плохими учебниками в сети).Использование ./text() или X/text() в этой ситуации дает вам все дочерние элементы текстового узла элемента.Часто у элемента есть один дочерний текстовый узел, строковое значение которого совпадает со строковым значением элемента, но ваш код завершается ошибкой, если кто-то добавляет комментарий или инструкцию обработки, потому что значение затем разделяется на несколько текстовых узлов.Он также завершается ошибкой, если элемент равен единице (скажем, «title»), который допускает смешанное содержимое: string(title) и title/text() будут давать один и тот же ответ, пока вы не нажмете статью с заголовком

<title>On the wetness of H<sub>2</sub>O</title>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...