Сохранение пробелов через цепочку обработки XML / XSLT - PullRequest
2 голосов
/ 01 июня 2011
  1. Пользователь вводит текст в многострочное текстовое поле в браузере
  2. Данные сохраняются как часть фрагмента XML в столбце XML SQL Server
  3. Ниже приведен фрагмент XMLвключены в большой XML-документ
  4. Документ обрабатывается с помощью XSLT в электронном письме в формате HTML
  5. Ожидается, что получатель увидит исходные разрывы строк

Я пытался:

  • CDATA (удалено SQL)
  • <PRE> тег в выводе вокруг комментариев и кодировка символа NL
  • кодированный <BR> тег в данных (не расшифровывается в HTML)

Можно ли это сделать без повторной архитектуры всего?

Для запроса в комментариях приведен фактический код:

XSL

<TD>
    <xsl:value-of select="//MemoComment"/>
</TD>

Вариации входных данных в XSLT

  1. <MemoComment>Previous job: Associate, Boston<br/>Test1<br/>Test2</MemoComment>
  2. <MemoComment>Previous job: Associate, Boston &amp;#xA;Test1 &amp;#xA;Test2</MemoComment>
  3. <MemoComment>Previous job: Associate, Boston&amp;lt;br/&amp;gt;Test1&lt;br/&gt;Test2</MemoComment>

Соответствующие результаты XSLT

  1. <TD>Previous job: Associate, BostonTest1Test2</TD>
  2. <TD>Previous job: Associate, Boston&amp;#xA;Test1&amp;#xA;Test2</TD>
  3. <TD>Previous job: Associate, Boston&amp;lt;br/&amp;gt;Test1&lt;br/&gt;Test2</TD>

Nодин из которых правильно отображается в Outlook.

Ответы [ 2 ]

3 голосов
/ 02 июня 2011

Причиной вашей проблемы было то, что вы использовали <xsl:value-of>

<TD>
    <xsl:value-of select="//MemoComment"/>
</TD>

когда вам действительно нужно <xsl:copy-of>

<TD>
    <xsl:copy-of select="//MemoComment/node()"/>
</TD>

<xsl:value-of> только выбирает строковое значение выбранного узла. На самом деле вы хотели скопировать весь узел, включая элементы, которые он содержал. Затем вы можете сохранить данные в виде отформатированного фрагмента XHTML без необходимости экранирования синтаксиса элемента (формат № 1 в вашем списке ввода).

Использование disabe-output-escaping="yes" часто не рекомендуется, потому что это может привести к выводу искаженного XML. Также все процессоры XSLT не реализуют эту функцию, поскольку она фактически вступает в силу только при сериализации документа и может не иметь никакого эффекта, если выходной документ передается из процессора в виде структуры данных.

1 голос
/ 01 июня 2011

Попробуйте внедрить в ваш текст экранированные элементы <br> и установите для атрибута disable-output-escaping элемента <xsl:value-of> значение yes:

<MemoComment>Previous job: Associate, Boston&lt;br/&gt;Test1&lt;br/&gt;Test2</MemoComment>

<xsl:value-of select="//MemoComment" disable-output-escaping="yes" />
...