+1: это более надежно, чем <xsl:text>использование метода новой строки, если вы используете что-либо, что может переформатировать ваш XSL-файл и смешаться с пробелами.
Ян Робертс
49
Мой любимый метод для этого выглядит примерно так:
<xsl:stylesheet><xsl:outputmethod='text'/><xsl:variablename='newline'><xsl:text></xsl:text></xsl:variable><!-- note that the layout there is deliberate -->
...
</xsl:stylesheet>
Затем, когда вы хотите вывести новую строку (возможно, в csv), вы можете вывести что-то вроде следующего:
Обратите внимание, что ответ Флориона ниже значительно более стабилен, чем мой.
Ник Гибсон
1
Возможно, стоит добавить объявление xml:space="preserve"к xsl:textэлементу для повышения стабильности, но я согласен, что ответ @ Florjon, вероятно, более безопасный.
Flynn1179
Недостатком этого решения является также включение любого отступа, что может быть нежелательно.
Wmassingham
47
Включите атрибут Method = "text" в тег xsl: output и добавьте новые строки в свой текстовый контент в XSL в соответствующих точках. Если вы предпочитаете хранить исходный код своей XSL-записи, используйте объект, в котором вы хотите новую строку.
ИМХО не нужно больше информации, чем дал @Florjon. Может быть, осталось немного мелких деталей, чтобы понять, почему это иногда не работает для нас.
Прежде всего, 
(hex) или 
(dec) внутри a <xsl:text/>всегда будут работать, но вы можете их не видеть.
В разметке HTML нет новой строки. Использование простой <br/>подойдет. В противном случае вы увидите пустое пространство. Просмотр источника из браузера покажет вам, что на самом деле произошло. Однако в некоторых случаях вы ожидаете такого поведения, особенно если потребитель не является браузером напрямую. Например, вы хотите создать HTML-страницу и просмотреть ее структуру, отформатированную с пустыми строками и идентификаторами, прежде чем отправлять ее в браузер.
Помните, где вам нужно использовать, disable-output-escapingа где нет. Возьмите следующий пример, где мне нужно было создать xml из другого и объявить его DTD из таблицы стилей.
Первая версия экранирует символы (по умолчанию для xsl: text)
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"version="1.0"><xsl:outputmethod="xml"indent="yes"encoding="utf-8"/><xsl:templatematch="/"><xsl:text><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text><xsl:copy><xsl:apply-templatesselect="*"mode="copy"/></xsl:copy></xsl:template><xsl:templatematch="@*|node()"mode="copy"><xsl:copy><xsl:apply-templatesselect="@*|node()"mode="copy"/></xsl:copy></xsl:template></xsl:stylesheet>
и вот результат:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions><Userid="1"/></Subscriptions>
Хорошо, он делает то, что мы ожидаем, экранирование выполняется так, чтобы используемые символы отображались правильно. Форматирование XML-части внутри корневого узла выполняется с помощью ident="yes". Но при ближайшем рассмотрении мы видим, что символ новой строки 
не был экранирован и переведен как есть, выполнив двойной перевод строки! У меня нет объяснения этому, будет полезно узнать. Кто угодно?
Вторая версия не избегает персонажей, поэтому они создают то, для чего они предназначены. Сделанное изменение было:
<xsl:textdisable-output-escaping="yes"><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
и вот результат:
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"><Subscriptions><Userid="1"/></Subscriptions>
и это будет хорошо. Оба cr и lf правильно отображаются.
Не забывайте, что мы говорим nl, а не crlf( nl=lf). Моя первая попытка состояла в том, чтобы использовать только cr: 
и хотя выходной xml был правильно проверен DOM.
Я просматривал поврежденный XML:
<?xml version="1.0" encoding="utf-8"?><Subscriptions>riptions SYSTEM "Subscriptions.dtd">
<Userid="1"/></Subscriptions>
Парсер DOM игнорировал управляющие символы, но обработчик - нет. Я провел довольно много времени, стуча головой, прежде чем понял, как глупо я этого не видел!
Для записи я использую переменную внутри тела с обоими CRLF, чтобы быть на 100% уверенной, что она будет работать везде.
Однако я использую задачу Ant <echoxml> для создания таблиц стилей и запуска их для файлов. Задача будет выполнять шаблоны значений атрибутов, например, $ {DSTAMP}, но также будет переформатировать ваш xml, поэтому в некоторых случаях ссылка на сущность предпочтительнее.
Если вы используете переменную, лучше использовать selectвместо xsl:text. Пример: таким <xsl:variable name="nl" select="'
'"/>образом вы не создаете ненужный RTF (фрагмент дерева результатов).
Даниэль Хейли
2
Я обнаружил разницу между буквальными символами новой строки <xsl:text>и буквальными символами новой строки 
.
В то время как буквальные переводы строк работали нормально в моей среде (с использованием Saxon и процессора Java XSLT по умолчанию), мой код завершился ошибкой, когда он был выполнен другой группой, работающей в среде .NET.
При переходе на entity ( 
) мой код генерации файлов работал одинаково на Java и .NET.
Кроме того, буквенные символы новой строки уязвимы для переформатирования в IDE и могут случайно потеряться, если файл поддерживается кем-то «не в курсе».
Я заметил , из моего опыта , что производство новой линии ВНУТРИ в <xsl:variable>статье не работает. Я пытался сделать что-то вроде:
<xsl:variablename="myVar"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/><xsl:text></xsl:text><!--NEW LINE--><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar"/></div>
Все, что я пытался вставить в эту «новую строку» (пустой <xsl:text>узел), просто не работало (включая большинство простых предложений на этой странице), не говоря уже о том, что HTML там просто не будет работать, поэтому в итоге я пришлось разделить его на 2 переменные, вызвать их вне области <xsl:variable>видимости и поместить простое <br/>между ними, то есть:
<xsl:variablename="myVar1"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My value: </xsl:text><xsl:value-ofselect="@myValue"/></xsl:when></xsl:choose><xsl:variable><xsl:variablename="myVar2"><xsl:choose><xsl:whentest="@myValue != ''"><xsl:text>My other value: </xsl:text><xsl:value-ofselect="@myOtherValue"/></xsl:when></xsl:choose><xsl:variable><div><xsl:value-ofselect="$myVar1"/><br/><xsl:value-ofselect="$myVar2"/></div>
Да, я знаю, это не самое сложное решение, но оно работает, просто делюсь своим опытом разочарования с XSL;)
Я не мог просто использовать этот <xsl:text>
</xsl:text>подход, потому что если я отформатирую XML-файл с использованием XSLT, сущность исчезнет. Так что мне пришлось использовать немного более округлый подход к использованию переменных
Ответы:
Следующий код XSL создаст символ новой строки ( перевода строки):
Для возврата каретки используйте:
источник
<xsl:text>
использование метода новой строки, если вы используете что-либо, что может переформатировать ваш XSL-файл и смешаться с пробелами.Мой любимый метод для этого выглядит примерно так:
Затем, когда вы хотите вывести новую строку (возможно, в csv), вы можете вывести что-то вроде следующего:
Я использовал эту технику при выводе SQL из ввода XML. На самом деле, я склонен создавать переменные для запятых, кавычек и новых строк.
источник
xml:space="preserve"
кxsl:text
элементу для повышения стабильности, но я согласен, что ответ @ Florjon, вероятно, более безопасный.Включите атрибут Method = "text" в тег xsl: output и добавьте новые строки в свой текстовый контент в XSL в соответствующих точках. Если вы предпочитаете хранить исходный код своей XSL-записи, используйте объект, в
котором вы хотите новую строку.источник
Ты можешь использовать:
<xsl:text> </xsl:text>
посмотрите пример
если вы напишите это в файле, например,
эта переменная создаст новую строку infile как:
источник
ИМХО не нужно больше информации, чем дал @Florjon. Может быть, осталось немного мелких деталей, чтобы понять, почему это иногда не работает для нас.
Прежде всего,


(hex) или

(dec) внутри a<xsl:text/>
всегда будут работать, но вы можете их не видеть.<br/>
подойдет. В противном случае вы увидите пустое пространство. Просмотр источника из браузера покажет вам, что на самом деле произошло. Однако в некоторых случаях вы ожидаете такого поведения, особенно если потребитель не является браузером напрямую. Например, вы хотите создать HTML-страницу и просмотреть ее структуру, отформатированную с пустыми строками и идентификаторами, прежде чем отправлять ее в браузер.disable-output-escaping
а где нет. Возьмите следующий пример, где мне нужно было создать xml из другого и объявить его DTD из таблицы стилей.Первая версия экранирует символы (по умолчанию для xsl: text)
и вот результат:
Хорошо, он делает то, что мы ожидаем, экранирование выполняется так, чтобы используемые символы отображались правильно. Форматирование XML-части внутри корневого узла выполняется с помощью
ident="yes"
. Но при ближайшем рассмотрении мы видим, что символ новой строки

не был экранирован и переведен как есть, выполнив двойной перевод строки! У меня нет объяснения этому, будет полезно узнать. Кто угодно?Вторая версия не избегает персонажей, поэтому они создают то, для чего они предназначены. Сделанное изменение было:
и вот результат:
и это будет хорошо. Оба cr и lf правильно отображаются.
nl
, а неcrlf
(nl=lf
). Моя первая попытка состояла в том, чтобы использовать только cr:
и хотя выходной xml был правильно проверен DOM.Я просматривал поврежденный XML:
Парсер DOM игнорировал управляющие символы, но обработчик - нет. Я провел довольно много времени, стуча головой, прежде чем понял, как глупо я этого не видел!
Для записи я использую переменную внутри тела с обоими CRLF, чтобы быть на 100% уверенной, что она будет работать везде.
источник
Я добавил
DOCTYPE
директиву, которую вы видите здесь:Это позволяет мне использовать
&nl;
вместо

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

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


) мой код генерации файлов работал одинаково на Java и .NET.Кроме того, буквенные символы новой строки уязвимы для переформатирования в IDE и могут случайно потеряться, если файл поддерживается кем-то «не в курсе».
источник
Я заметил , из моего опыта , что производство новой линии ВНУТРИ в
<xsl:variable>
статье не работает. Я пытался сделать что-то вроде:Все, что я пытался вставить в эту «новую строку» (пустой
<xsl:text>
узел), просто не работало (включая большинство простых предложений на этой странице), не говоря уже о том, что HTML там просто не будет работать, поэтому в итоге я пришлось разделить его на 2 переменные, вызвать их вне области<xsl:variable>
видимости и поместить простое<br/>
между ними, то есть:Да, я знаю, это не самое сложное решение, но оно работает, просто делюсь своим опытом
разочарованияс XSL;)источник
Я не мог просто использовать этот
<xsl:text>
</xsl:text>
подход, потому что если я отформатирую XML-файл с использованием XSLT, сущность исчезнет. Так что мне пришлось использовать немного более округлый подход к использованию переменныхисточник
просто добавьте этот тег:
меня устраивает ;) .
источник