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

Разница между текстом() и строкой()

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

4b9b3361

Ответ 1

Может кто-нибудь объяснить разницу между функциями 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
"

Ответ 2

В большинстве случаев, если вы хотите содержимое элемента node X, вы можете ссылаться на него как ".", если это контекст node или как "X", если он является дочерним элементом контекст node. Например:

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

или

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

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

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

<title>On the wetness of H<sub>2</sub>O</title>