2010-09-20 3 views
-1

J'essaie de créer un rapport dans un courrier électronique et des lignes de hachage de démons d'e-mail s'ils dépassent 2040 caractères. J'utilise XSLT pour créer le rapport d'email et j'ai besoin de casser ces lignes mais j'ai toujours besoin que le lien fonctionne.Comment limiter la longueur de ligne pour le courrier électronique 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> 

Ce n'est pas mon code et je ne suis pas familier avec réel mais j'ai XSL recherché ici et sur le web et je ne vois pas vraiment une solution impressionnante.

+0

@ Thomas-Schultz: Pourriez-vous, s'il vous plaît, donner un exemple complet (mais minime) - le document XML source (aussi minime que possible), la compléter la feuille de style XSLT (aussi minime que possible) et le résultat souhaité lorsque la feuille de style XSLT fournie est appliquée sur le document XML fourni? Le manque de ceux-ci rend le travail sur votre problème plus d'une conjecture que l'activité logique. S'il vous plaît. –

+0

Désolé, je n'ai pas vérifié à temps pour ajouter cela là-dedans. Alejandro l'a cloué cependant. –

Répondre

1

Cette expression 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;') 

Pour le test, cette entrée:

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

Avec cette XSLT 2.0 stylesheet:

<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> 

Sortie:

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

Juste au cas où, ce XSLT 1.0 stylesheet:

<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> 
+0

C'est génial! Je vous remercie! –

+0

@ Thomas Schultz: Vous êtes bienvenu! –

Questions connexes