Как реализовать возврат каретки в XSLT - PullRequest
21 голосов
/ 19 июня 2009

Я хочу реализовать возврат каретки в xslt. Проблема у меня есть переменная: Шаг 1 = значение 1 breaktag. Шаг 2 = Значение 2 в виде строки, которое должно отображаться как

.

Шаг 1 = Значение 1

Шаг 2 = Значение 2

в HTML-форме, но я получаю тег br на странице. Любые хорошие способы реализации возврата строки / перевода строки в xsl приветствуются

Ответы [ 10 ]

42 голосов
/ 19 июня 2009

Как альтернатива

<xsl:text>
</xsl:text>

вы можете использовать

<xsl:text>&#10;</xsl:text> <!-- newline character -->

или

<xsl:text>&#13;</xsl:text> <!-- carriage return character -->

на тот случай, если вы не хотите испортить свой отступ

7 голосов
/ 13 мая 2014

Это работает для меня, как возврат каретки + спасательный круг.

<xsl:text>&#xD;&#xA;</xsl:text>

" "строка не работает.

4 голосов
/ 19 июня 2009

использовать простой возврат каретки в элементе xsl: text

<xsl:text>
</xsl:text>
3 голосов
/ 26 июля 2014

Самый простой способ, который я нашел, это вставить объявления !ENTITY в верхнюю часть таблицы стилей для новой строки, табуляции и других общих текстовых конструкций. Когда в вывод выводится множество элементов форматирования, это делает лист преобразования более чистым.

Например:

<?xml version="1.0"?>
<!DOCTYPE xsl:stylesheet [
    <!ENTITY nl "<xsl:text>
</xsl:text>">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="step">
    &nl;&nl;
    <xsl:apply-templates  />
  </xsl:template>

...

3 голосов
/ 27 мая 2014

Я искал хорошее решение для этого, как многие предпочли бы, без встраивания escape-последовательностей непосредственно в выражения или без странных разрывов строк внутри переменной. Я обнаружил, что гибрид этих двух подходов действительно работает, встраивая текстовый узел в переменную следующим образом:

<xsl:variable name="newline"><xsl:text>&#10;</xsl:text></xsl:variable>
<xsl:value select="concat(some_element, $newline)" />

Еще одним приятным побочным эффектом этого является то, что вы можете передавать любую новую строку, какую хотите, будь то LF, CR или оба CRLF.

- Daniel

3 голосов
/ 24 ноября 2010

Попробуйте это в конце строки, где вы хотите возврат каретки. Это сработало для меня.

<xsl:text><![CDATA[<br />]]></xsl:text>
1 голос
/ 26 июля 2013

Вот подход, который использует рекурсивный шаблон, который ищет &#10; в строке из базы данных и затем выводит подстроку ранее. Если после &#10; остается подстрока, то шаблон вызывает сам себя, пока ничего не останется. Если &#10; отсутствует, то текст выводится просто.

Вот вызов шаблона (просто замените @ActivityExtDescription на поле вашей базы данных):

<xsl:call-template name="MultilineTextOutput">
    <xsl:with-param name="text" select="@ActivityExtDescription" />
</xsl:call-template>

и вот код самого шаблона:

<xsl:template name="MultilineTextOutput">
<xsl:param name="text"/>
<xsl:choose>
    <xsl:when test="contains($text, '&#10;')">
        <xsl:variable name="text-before-first-break">
            <xsl:value-of select="substring-before($text, '&#10;')" />
        </xsl:variable>
        <xsl:variable name="text-after-first-break">
            <xsl:value-of select="substring-after($text, '&#10;')" />
        </xsl:variable>

        <xsl:if test="not($text-before-first-break = '')">
            <xsl:value-of select="$text-before-first-break" /><br />
        </xsl:if>

        <xsl:if test="not($text-after-first-break = '')">
            <xsl:call-template name="MultilineTextOutput">
                <xsl:with-param name="text" select="$text-after-first-break" />
            </xsl:call-template>
        </xsl:if>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$text" /><br />
    </xsl:otherwise>
</xsl:choose>

Работает как шарм !!!

0 голосов
/ 07 января 2015

Это единственное решение, которое сработало для меня. За исключением того, что я заменял & # 10 ; с \ r \ n

0 голосов
/ 19 июня 2009

Я разделил значения с помощью Environment.NewLine, а затем использовал предварительный тег в html для эмуляции эффекта, который искал

0 голосов
/ 19 июня 2009

Я полагаю, что для этого вы можете использовать тег xsl: text, как в

<xsl:text>
</xsl:text>

Скорее всего, если поместить закрывающий тег на отдельной строке, символ новой строки станет частью литерального текста и будет выведен как таковой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...