Как ограничить длину строки для электронной почты XSLT - PullRequest
0 голосов
/ 21 сентября 2010

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

<xsl:variable name="encoded_url">
    <xsl:value-of select="saxon:string-to-base64Binary(concat(PROTOCOL,'://',URL),'UTF8')" xmlns:saxon="http://saxon.sf.net/"/>
</xsl:variable>
<dd style="{$style-dd}">
    <a title="View URL"
        href="{$baseHref}report?url={$encoded_url}" style="{$style-links}">
        <xsl:call-template name="break-url" >
            <xsl:with-param name="url" select="URL" />
            <xsl:with-param name="length">75</xsl:with-param>
            <xsl:with-param name="lines">999</xsl:with-param>
        </xsl:call-template>
    </a>

Это не мой код, и я не очень знаком с XSL, но я искал здесь и в Интернете, и я действительно не вижу удивительного решения.

1 Ответ

1 голос
/ 21 сентября 2010

Это выражение XPath 2.0:

string-join(for $line in tokenize(line,'&#xA;'),
                $length in string-length($line)
            return if ($length > $pMaxLength)
                   then substring(replace($line,
                                          concat('(.{1,',
                                                 $pMaxLength,
                                                 '})'),
                                          '$1&#xA;'),
                                  1,
                                  $length + ceiling($length div $pMaxLength) -1)
                   else $line,
            '&#xA;')

Для теста этот вход:

<line>
line1
line2 line2 line2 line2
line3line3
line4line4
line5line5line5line5line5
</line>

С помощью этой таблицы стилей XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:param name="pMaxLength" select="10"/>
    <xsl:template match="/">
        <xsl:value-of
         select="string-join(
                     for $line in tokenize(line,'&#xA;'),
                         $length in string-length($line)
                     return if ($length > $pMaxLength)
                            then substring(replace($line,
                                                   concat('(.{1,',
                                                          $pMaxLength,
                                                          '})'),
                                                   '$1&#xA;'),
                                           1,
                                           $length +
                                           ceiling($length div $pMaxLength) - 1)
                            else $line,
                     '&#xA;')"/>
    </xsl:template>
</xsl:stylesheet>

Вывод:

line1
line2 line
2 line2 li
ne2
line3line3
line4line4
line5line5
line5line5
line5

На всякий случай, эта таблица стилей XSLT 1.0:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="line/text()" name="lines">
        <xsl:param name="pString" select="."/>
        <xsl:param name="pMaxLength" select="10"/>
        <xsl:choose>
            <xsl:when test="contains($pString,'&#xA;')">
                <xsl:call-template name="lines">
                    <xsl:with-param name="pString" 
                     select="substring-before($pString,'&#xA;')"/>
                    <xsl:with-param name="pMaxLength" 
                     select="$pMaxLength"/>
                </xsl:call-template>
                <xsl:call-template name="lines">
                    <xsl:with-param name="pString" 
                     select="substring-after($pString,'&#xA;')"/>
                    <xsl:with-param name="pMaxLength" 
                     select="$pMaxLength"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="concat(substring($pString,1,$pMaxLength),
                                             '&#xA;')"/>
                <xsl:apply-templates 
                 select="current()[string-length($pString) > $pMaxLength]">
                    <xsl:with-param name="pString"
                     select="substring($pString,$pMaxLength+1)"/>
                    <xsl:with-param name="pMaxLength" select="$pMaxLength"/>
                </xsl:apply-templates>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...