Ответы:
Следующий код XSL создаст символ новой строки ( перевода строки):
<xsl:text>
</xsl:text>
Для возврата каретки используйте:
<xsl:text>
</xsl:text>
<xsl:text>
использование метода новой строки, если вы используете что-либо, что может переформатировать ваш XSL-файл и смешаться с пробелами.
Мой любимый метод для этого выглядит примерно так:
<xsl:stylesheet>
<xsl:output method='text'/>
<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>
<!-- note that the layout there is deliberate -->
...
</xsl:stylesheet>
Затем, когда вы хотите вывести новую строку (возможно, в csv), вы можете вывести что-то вроде следующего:
<xsl:value-of select="concat(elem1,elem2,elem3,$newline)" />
Я использовал эту технику при выводе SQL из ввода XML. На самом деле, я склонен создавать переменные для запятых, кавычек и новых строк.
xml:space="preserve"
к xsl:text
элементу для повышения стабильности, но я согласен, что ответ @ Florjon, вероятно, более безопасный.
Включите атрибут Method = "text" в тег xsl: output и добавьте новые строки в свой текстовый контент в XSL в соответствующих точках. Если вы предпочитаете хранить исходный код своей XSL-записи, используйте объект, в
котором вы хотите новую строку.
Ты можешь использовать: <xsl:text> </xsl:text>
посмотрите пример
<xsl:variable name="module-info">
<xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
<xsl:text> </xsl:text>
</xsl:variable>
если вы напишите это в файле, например,
<redirect:write file="temp.prop" append="true">
<xsl:value-of select="$module-info" />
</redirect:write>
эта переменная создаст новую строку infile как:
commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4
ИМХО не нужно больше информации, чем дал @Florjon. Может быть, осталось немного мелких деталей, чтобы понять, почему это иногда не работает для нас.
Прежде всего, 

(hex) или 

(dec) внутри a <xsl:text/>
всегда будут работать, но вы можете их не видеть.
<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% уверенной, что она будет работать везде.
Я добавил DOCTYPE
директиву, которую вы видите здесь:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nl "
">
]>
<xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
Это позволяет мне использовать &nl;
вместо 

вывода новой строки в выводе. Как и другие решения, это обычно помещается внутри <xsl:text>
тега.
Можешь попробовать,
<xsl:text>
</xsl:text>
Это сработает.
Я второй метод Ник Гибсон, это всегда был мой любимый:
<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>
Однако я использую задачу Ant <echoxml> для создания таблиц стилей и запуска их для файлов. Задача будет выполнять шаблоны значений атрибутов, например, $ {DSTAMP}, но также будет переформатировать ваш xml, поэтому в некоторых случаях ссылка на сущность предпочтительнее.
<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>
select
вместо xsl:text
. Пример: таким <xsl:variable name="nl" select="'
'"/>
образом вы не создаете ненужный RTF (фрагмент дерева результатов).
Я обнаружил разницу между буквальными символами новой строки <xsl:text>
и буквальными символами новой строки 

.
В то время как буквальные переводы строк работали нормально в моей среде (с использованием Saxon и процессора Java XSLT по умолчанию), мой код завершился ошибкой, когда он был выполнен другой группой, работающей в среде .NET.
При переходе на entity ( 

) мой код генерации файлов работал одинаково на Java и .NET.
Кроме того, буквенные символы новой строки уязвимы для переформатирования в IDE и могут случайно потеряться, если файл поддерживается кем-то «не в курсе».
Я заметил , из моего опыта , что производство новой линии ВНУТРИ в <xsl:variable>
статье не работает. Я пытался сделать что-то вроде:
<xsl:variable name="myVar">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My value: </xsl:text>
<xsl:value-of select="@myValue" />
<xsl:text></xsl:text> <!--NEW LINE-->
<xsl:text>My other value: </xsl:text>
<xsl:value-of select="@myOtherValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<div>
<xsl:value-of select="$myVar"/>
</div>
Все, что я пытался вставить в эту «новую строку» (пустой <xsl:text>
узел), просто не работало (включая большинство простых предложений на этой странице), не говоря уже о том, что HTML там просто не будет работать, поэтому в итоге я пришлось разделить его на 2 переменные, вызвать их вне области <xsl:variable>
видимости и поместить простое <br/>
между ними, то есть:
<xsl:variable name="myVar1">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My value: </xsl:text>
<xsl:value-of select="@myValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<xsl:variable name="myVar2">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My other value: </xsl:text>
<xsl:value-of select="@myOtherValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<div>
<xsl:value-of select="$myVar1"/>
<br/>
<xsl:value-of select="$myVar2"/>
</div>
Да, я знаю, это не самое сложное решение, но оно работает, просто делюсь своим опытом разочарования с XSL;)
Я не мог просто использовать этот <xsl:text>
</xsl:text>
подход, потому что если я отформатирую XML-файл с использованием XSLT, сущность исчезнет. Так что мне пришлось использовать немного более округлый подход к использованию переменных
<xsl:variable name="nl" select="' '"/>
<xsl:template match="/">
<xsl:value-of select="$nl" disable-output-escaping="no"/>
<xsl:apply-templates select="*"/>
</xsl:template>
просто добавьте этот тег:
<br/>
меня устраивает ;) .