К сожалению, функция normalize-space()
(используется в ответе andynormancx) делает больше, чем просто удаляет символы новой строки .
Удаляет все начальные и конечные пробелы, а заменяет любую группу внутренних конфликтующих пробелов одним пробелом .
Во многих случаях мы хотим удалить только один тип символа пробела (как в текущем случае - новые строки (CR + LF автоматически нормализуется при считывании анализатором XML только на LF).
Правильный и безопасный способ сделать это - использовать стандартную функцию XPath translate()
:
translate(., '
', '')
возвращает строку, полученную из строкового значения текущего узла, в котором удаляется любой символ новой строки.
Вот пример :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of
select="translate(.,'
','')"/>
</xsl:template>
</xsl:stylesheet>
Когда вышеуказанное преобразование применяется к этому исходному XML-документу :
<t>
$LOG: 08880xbpnd $
"embedded blanks must stay"
df
sd
fsd
f
sd
fsd
</t>
Результат находится только в одной строке, и все встроенные пробелы остаются без изменений :
<t>$LOG: 08880xbpnd $"embedded blanks must stay"dfsdfsdfsdfsd</t>