2013-06-26 140 views
3

我在FOP中有一个表格,它运行良好,直到我收到一个很长的单词。然后该单词覆盖表格中结尾的单元格。我试着总结选项=“包装”表细胞和/或细胞块内,但它不工作使用FOP中的长单词在表格单元格中进行换行

**Total Edit**

,因为我估计是去繁就只显示这里位为完整的XSL文件:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo"> 
<xsl:output method="xml" version="1.0" omit-xml-declaration="no" indent="yes" /> 
<xsl:param name="tableCell" select="'1.0'" /> 

<!-- Globale Variablen START --> 

<xsl:param name="tabbgcolor" select="'#EEEEEE'" /> 



<!-- Globale Variablen ENDE --> 

<xsl:template match="/datasheet"> 
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 
     <fo:layout-master-set> 
      <fo:simple-page-master page-height="29.7cm" page-width="21cm" margin-top="1cm" margin-bottom="1cm" margin-left="1.5cm" margin-right="1.5cm" master-name="first"> 
       <fo:region-body margin-top="20mm" margin-bottom="20mm" /> 
       <fo:region-before extent="15mm" /> 
       <fo:region-after extent="15mcm" /> 
      </fo:simple-page-master> 
      <fo:simple-page-master master-name="new" margin-right="1.0cm" margin-left="1.0cm" margin-bottom="1cm" margin-top="1cm" page-height="21cm" page-width="29.7cm"> 
       <fo:region-body margin-top="30mm" margin-bottom="20mm" /> 
       <fo:region-before extent="30mm" /> 
       <fo:region-after extent="15mm" /> 
      </fo:simple-page-master> 
     </fo:layout-master-set> 



     <fo:page-sequence language="de" country="DE" master-reference="new" initial-page-number="1"> 

      <fo:static-content flow-name="xsl-region-before"> 
       <fo:block text-align="center" font-size="12pt" padding="5pt" font-weight="bold"> 
        <xsl:value-of select="title" /> 
       </fo:block> 
       <fo:block text-align="right" font-size="12pt" padding="5pt" font-weight="bold"> 
        <xsl:value-of select="date" /> 
       </fo:block> 
       <fo:block text-align="right" font-size="12pt" padding="0pt" font-weight="bold"> 
        <xsl:value-of select="time" /> 
       </fo:block> 
       <fo:block> 
        <fo:leader leader-length="100%" leader-pattern="rule" rule-thickness="2pt" color="black" /> 
       </fo:block> 
      </fo:static-content> 

      <fo:static-content flow-name="xsl-region-after"> 
       <fo:block text-align="center"> 
        Seite 
        <fo:page-number /> 
        von 
        <fo:page-number-citation ref-id="TheVeryLastPage" /> 
       </fo:block> 
      </fo:static-content> 





      <fo:flow flow-name="xsl-region-body"> 



       <fo:block> 
        <fo:leader /> 
       </fo:block> 
       <fo:block> 
        <fo:leader /> 
       </fo:block> 
       <fo:block> 
        <fo:leader /> 
       </fo:block> 


       <fo:block font-weight="bold" padding="5pt" padding-top="25pt"> 
        Jahre <xsl:value-of select="fromYear" /> bis <xsl:value-of select="toYear" /> 
       </fo:block> 

       <fo:block text-align="center"> 
        <xsl:choose> 
         <xsl:when test="dataList != ''"> 
          <fo:table table-layout="fixed" width="100%" border-style="solide" border-width="1pt"> 
           <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> 
           <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> 
           <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> 
           <fo:table-column column-width="25%" border-style="solid" border-width="1pt" /> 



           <fo:table-header> 
            <fo:table-row> 
             <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> 
              <fo:block> 
               Cell1 
              </fo:block> 
             </fo:table-cell> 
             <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> 
              <fo:block> 
               Cell2 
              </fo:block> 
             </fo:table-cell> 
             <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> 
              <fo:block> 
               Cell3 
              </fo:block> 
             </fo:table-cell> 
             <fo:table-cell border-style="solid" font-weight="bold" border-width="0pt"> 
              <fo:block> 
               Cell4 
              </fo:block> 
             </fo:table-cell> 

            </fo:table-row> 
           </fo:table-header> 

           <fo:table-body> 
            <xsl:for-each select="dataList"> 
             <fo:table-row> 
              <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> 
               <fo:block text-align="left"> 
                <xsl:value-of select="data1" /> 
               </fo:block> 
              </fo:table-cell> 
              <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> 
               <fo:block text-align="left"> 
                <xsl:value-of select="data2" /> 
               </fo:block> 
              </fo:table-cell> 
              <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> 
               <fo:block text-align="left"> 
                <xsl:value-of select="data3" /> 
               </fo:block> 
              </fo:table-cell> 
              <fo:table-cell padding="5pt" border-style="solid" border-width="1pt"> 
               <fo:block text-align="left"> 
                <xsl:call-template name="intersperse-with-zero-spaces"> 
<xsl:with-param name="str" select="data4"/> 
</xsl:call-template> 
               </fo:block> 
              </fo:table-cell> 

             </fo:table-row> 
            </xsl:for-each> 
           </fo:table-body> 

          </fo:table> 
         </xsl:when> 
         <xsl:otherwise> 
          <fo:block padding="6cm" text-align="center" font-weight="bold" font-size="16pt">No data. 
          </fo:block> 
         </xsl:otherwise> 
        </xsl:choose> 
       </fo:block> 


       <fo:block id="TheVeryLastPage"> 
       </fo:block> 
      </fo:flow> 
     </fo:page-sequence> 

     <!-- ___________________________________________________________________________________________________________ --> 





    </fo:root> 

</xsl:template> 

<xsl:template name="intersperse-with-zero-spaces"> 
<xsl:param name="str"/> 
<xsl:variable name="spacechars"> 
    &#x9;&#xA; 
    &#x2000;&#x2001;&#x2002;&#x2003;&#x2004;&#x2005; 
    &#x2006;&#x2007;&#x2008;&#x2009;&#x200A;&#x200B; 
</xsl:variable> 

<xsl:if test="string-length($str) &gt; 0"> 
    <xsl:variable name="c1" select="substring($str, 1, 1)"/> 
    <xsl:variable name="c2" select="substring($str, 2, 1)"/> 

    <xsl:value-of select="$c1"/> 
    <xsl:if test="$c2 != '' and 
     not(contains($spacechars, $c1) or 
     contains($spacechars, $c2))"> 
     <xsl:text>&#x200B;</xsl:text> 
    </xsl:if> 

    <xsl:call-template name="intersperse-with-zero-spaces"> 
     <xsl:with-param name="str" select="substring($str, 2)"/> 
    </xsl:call-template> 
</xsl:if> 
</xsl:template> 




</xsl:stylesheet> 

细胞DATA4是一个与问题....像255个数字或字符一次没有连字符奥德空间。

的输入是从数据库中,但可能是这样的:

<datasheet> 
    <dataList> 
    <data1>intro</data1> 
    <data2>section</data2> 
    <data3>cutters</data3> 
    <data4>743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348743576746876357467569384657654687465874638563465873487435767468763574675693846576546874658746385634658734874357674687635746756938465765468746587463856346587348</data4> 

    </dataList> 
</datasheet> 

的结果应该是一个表,如:

|cell1 |cell2 |cell3 |cell4 | 
_________________________________ 
|intro |section|cutters|7435767| 
         |4687635| 
         |7467569| 
         |3846576| 
_________________________________ 
细胞

等现在4

的以上作品

+0

为了帮助您试图填充零空格的模板,请显示已放入模板的'开始标记(开头),以及名为“intersperse-与-零空间”。然后,最好显示样本输入(至少有一个长字符串块),期望输出(FO)和实际输出。 – LarsH

+1

感谢您发布样本数据和更多样式表。样式表中必须存在复制/粘贴错误...有一个'',它只能在模板的开头发生,在模板的中间。样式表因此无效。是否应该有两个模板?另外,我还没有看到名为intersperse-with-zero-spaces的模板;但也许你还在添加它。最后,你在使用什么XSLT处理器 - Xalan? XSLT 1.1是一个被遗弃的版本。 – LarsH

+0

xsl参数被删除C&P错误 我使用新的FOP bin – Thevagabond

回答

2

一种选择是让你打破在转换为FO时在XSLT中增加长数字/单词。你必须决定你想把它打破的地方。

参见: XSL-FO fop. Long text flows into adjacent cells/block, obscuring stuff there

更新(从注释复制):

必须有复制/样式表粘贴错误...有一个<xsl:param>,这种情况应该只是在发生在模板的中间开始模板。样式表因此无效。是否应该有两个模板?另外,我还没有看到名为intersperse-with-zero-spaces的模板;但也许你还在添加它。

更新2:

以上问题已在问题中得到解决。

我假设第二个模板不能为intersperse-with-zero-spaces,因为它正在调用该模板。我没有想到它应该是一个递归模板!顺便说一下,如果您可以选择使用XSLT 2.0,那么intersperse-with-zero-spaces模板可以被替换为效率更高的正则表达式替换。

+0

我试过这个,但它不适合我。 我现在正在测试零宽度空间,但不是很幸运..看我上面的编辑 – Thevagabond

+0

以前的评论是指在第一个更新上面的答案部分。 – LarsH

-1

添加hyphenate =“true”,然后它会自动调整表格单元格中的空格。

<fo:table-cell border-bottom-width="0px" border-left-width="0px" 
    border-right-width="0px" border-top-width="0px" font-size="9px" 
    padding-left="0px" border-style="solid" border-width="1pt" 
    border-color="white" padding-start="0px" padding-end="2px" 
    padding-before="0px" padding-after="0px" width="16%" display-align="center" 
    text-align="start" hyphenate="true"> 
+0

连字符与“调整空格”无关,它通常不适用于导致问题的长字符串。 – lfurini

1
<xsl:template name="intersperse-with-zero-spaces"> 
<xsl:param name="str"/> 
<xsl:variable name="spacechars"> 
    &#x9;&#xA; 
    &#x2000;&#x2001;&#x2002;&#x2003;&#x2004;&#x2005; 
    &#x2006;&#x2007;&#x2008;&#x2009;&#x200A;&#x200B; 
</xsl:variable> 

<xsl:if test="string-length($str) &gt; 0"> 
    <xsl:variable name="c1" select="substring($str, 1, 1)"/> 
    <xsl:variable name="c2" select="substring($str, 2, 1)"/> 

    <xsl:value-of select="$c1"/> 
    <xsl:if test="$c2 != '' and 
     not(contains($spacechars, $c1) or 
     contains($spacechars, $c2))"> 
     <xsl:text>&#x200B;</xsl:text> 
    </xsl:if> 

    <xsl:call-template name="intersperse-with-zero-spaces"> 
     <xsl:with-param name="str" select="substring($str, 2)"/> 
    </xsl:call-template> 
</xsl:if> 
</xsl:template> 

调用的地方使用调用象下面这样:

<fo:block text-align="left"> 
    <xsl:call-template name="intersperse-with-zero-spaces"> 
<xsl:with-param name="str" select="data4"/> 
</xsl:call-template> 
    </fo:block> 

我测试,它的正常工作。

相关问题