Это поведение соответствует спецификации XSLT 1.0 , и объяснение довольно сложное:
ПРИМЕЧАНИЕ : КогдаАтрибут xsl: содержит текстовый узел с символом новой строки, тогда вывод XML должен содержать ссылку на символ.Например,
<xsl:attribute name="a">x
y</xsl:attribute>
приведет к выводу
a="x
y"
(или с любой эквивалентной ссылкой на символ).Выходные данные XML не могут быть
a="x
y"
Это потому, что XML 1.0 требует, чтобы символы новой строки в значениях атрибута были нормализованы в пробелы, но требует, чтобы ссылки на символы новой строки не были нормализованы.Значения атрибута в модели данных представляют значение атрибута после нормализации.Если бы новая строка, встречающаяся в значении атрибута в дереве, выводилась как символ новой строки, а не как ссылка на символ, то значение атрибута в дереве, созданном путем повторного анализа XML, будет содержать пробел, а не символ новой строки, что будет означать, что дерево имеетне выводится правильно.
Итак, если вы действительно не хотите, чтобы символьная сущность, напишите :
<link>string</link>
, а не :
<link>string
</link>
В качестве альтернативы используйте :
<xsl:attribute name="href">
<xsl:value-of select="normalize-space(link)"/>
</xsl:attribute>
Однако имейте в виду, что это заменит любую группу непереходящих или непоследних пробелов.символы только с одним пробелом.