Кто-нибудь может объяснить разницу между функциями text() и string(). Я часто использую одну с другой, но это не имеет никакого значения, обе получат строковое значение узла xml.
В большинстве случаев, если вам нужно содержимое узла элемента 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>