2010-09-20 51 views
-1

我試圖在電子郵件和電子郵件守護程序中創建報告,如果它們超過2040個字符長度,會劃線。 我使用XSLT來構建電子郵件報告,我需要分解這些行,但我仍然需要鏈接才能工作。如何限制電子郵件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,但我已經搜查這裏,並在網絡上,我沒有真正看到一個真棒的解決方案。

+0

@托馬斯 - 舒爾茨:你能不能,請提供完整的(但最少)的例子 - 源XML文檔(儘可能小)時,完整的XSLT樣式表(儘可能最小)以及將所提供的XSLT樣式表應用於提供的XML文檔時所需的結果?缺乏這些使得你的問題更多的是猜測而不是邏輯活動。請。 – 2010-09-20 21:07:51

+0

對不起,我沒有及時檢查在那裏添加。亞歷杭德羅釘了它雖然。 – 2010-09-21 12:41:10

回答

1

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

太棒了!謝謝! – 2010-09-21 12:40:17

+0

@Thomas Schultz:你好! – 2010-09-21 13:23:50