ИМХО не нужно больше информации, чем дал @Florjon. Может быть, остались некоторые мелкие детали, чтобы понять, почему это иногда не работает для нас.
Прежде всего, 

(hex) или 

(dec) внутри <xsl:text/>
всегда будут работать, но вы можете его не видеть.
- В разметке HTML нет новой строки. Использование простого
<br/>
подойдет. В противном случае вы увидите пустое пространство. Просмотр источника из браузера покажет вам, что на самом деле произошло. Однако в некоторых случаях вы ожидаете такого поведения, особенно если потребитель не является браузером напрямую. Например, вы хотите создать страницу HTML и просмотреть ее структуру, отформатированную с пустыми строками и идентификаторами, прежде чем отправлять ее в браузер.
- Помните, где вам нужно использовать
disable-output-escaping
, а где нет. Возьмите следующий пример, где мне нужно было создать xml из другого и объявить его DTD из таблицы стилей.
Первая версия экранирует символы (по умолчанию для xsl: text)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/">
<xsl:text><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
<xsl:copy>
<xsl:apply-templates select="*" mode="copy"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="copy"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
и вот результат:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions>
<User id="1"/>
</Subscriptions>
Хорошо, он делает то, что мы ожидаем, экранирование выполняется, чтобы используемые символы отображались правильно. Форматирование XML-части внутри корневого узла обрабатывается ident="yes"
. Но при ближайшем рассмотрении мы видим, что символ новой строки 

не был экранирован и переведен как есть, выполнив двойной перевод строки! У меня нет объяснения этому, будет полезно узнать. Кто-нибудь?
Вторая версия не скрывает персонажей, поэтому они создают то, для чего они предназначены. Произведенное изменение было:
<xsl:text disable-output-escaping="yes"><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
и вот результат:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions>
<User id="1"/>
</Subscriptions>
и это будет хорошо. Оба cr и lf правильно отображаются.
- Не забывайте, что мы говорим о
nl
, а не crlf
(nl=lf
). Моя первая попытка состояла в том, чтобы использовать только cr: 
, и в то время как выходной xml был правильно проверен DOM.
Я просматривал поврежденный XML:
<?xml version="1.0" encoding="utf-8"?>
<Subscriptions>riptions SYSTEM "Subscriptions.dtd">
<User id="1"/>
</Subscriptions>
DOM-парсер игнорировал управляющие символы, но визуализированный - нет. Я потратил довольно много времени, стуча головой, прежде чем понял, как глупо я этого не видел!
Для записи я использую переменную внутри тела с обоими CRLF, чтобы быть на 100% уверенной, что она будет работать везде.