【问题标题】:XSL word wrapping issueXSL 自动换行问题
【发布时间】:2020-03-27 10:49:40
【问题描述】:

我有一个用 XSL 编码的表格,用于在执行时生成 pdf。用户在 CountryGroup 表格单元格中输入数据时出现问题。如果数据中没有空格,则会破坏单元格的边界,并且数据会溢出到其他单元格中,导致文档不可读。

我正在尝试找出一种使文本换行的方法。请看下面的代码sn-p:

 <fo:table-cell border="1pt solid black" display-align="after"><fo:block>Customer Seq Range</fo:block></fo:table-cell>
           <fo:table-cell border="1pt solid black" display-align="after"><fo:block>Label Code</fo:block></fo:table-cell>
           <fo:table-cell border="1pt solid black" display-align="after"><fo:block>Labelled Lot</fo:block></fo:table-cell>
           <fo:table-cell border="1pt solid black" display-align="after"><fo:block>Country Group</fo:block></fo:table-cell> <!--NCCRC200003  Country Group -->
           <fo:table-cell border="1pt solid black" display-align="after"><fo:block>Lot Expiry</fo:block></fo:table-cell>
           <fo:table-cell border="1pt solid black" display-align="after"><fo:block>QTY</fo:block></fo:table-cell>
     </fo:table-row>
    </fo:table-header>
    <fo:table-body>
    <fo:table-row font-size="9pt" font-weight="normal">
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="ItemNumber"/></fo:block></fo:table-cell>
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="RangeStart"/>-<xsl:value-of select="RangeEnd"/></fo:block></fo:table-cell>
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="CustRangeStart"/>-<xsl:value-of select="CustRangeEnd"/></fo:block></fo:table-cell>
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="LabelType"/></fo:block></fo:table-cell>
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="OtherLot"/></fo:block></fo:table-cell>
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="CountryGroup"/></fo:block></fo:table-cell> <!--NCCRC200003  Country Group. -->
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="ExpiryDate"/></fo:block></fo:table-cell>
        <fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"><fo:block><xsl:value-of select="Quantity"/></fo:block></fo:table-cell>
    </fo:table-row> 

【问题讨论】:

    标签: xslt xsl-fo


    【解决方案1】:

    如果您希望在文本中没有空格的情况下将一个块换成多行,请尝试将属性wrap-option 定义为"wrap"

    如果我重新缩进你的代码,你有:

    <fo:table-cell border="1pt solid black" padding="3mm 0mm" 
       display-align="center">
      <fo:block>
        <xsl:value-of select="CountryGroup"/>
      </fo:block>
    </fo:table-cell>
    

    我会通过以下方式更改上面的代码:

    <fo:table-cell border="1pt solid black" padding="3mm 0mm" 
       display-align="center">
      <fo:block wrap-option="wrap"><!-- added wrap-option attribute here -->
        <xsl:value-of select="CountryGroup"/>
      </fo:block>
    </fo:table-cell>
    

    更多信息在这里:XSL-FO fop. Long text flows into adjacent cells/block, obscuring stuff there

    如果这不起作用,您可以在块中注入零宽度空格,希望这有助于将您的文本包装成几行:

    <xsl:template name="string-replace-all">
      <xsl:param name="text" />
      <xsl:param name="replace" />
      <xsl:param name="by" />
      <xsl:choose>
        <xsl:when test="contains($text, $replace)">
          <xsl:value-of select="substring-before($text,$replace)" />
          <xsl:value-of select="$by" />
          <xsl:call-template name="string-replace-all">
            <xsl:with-param name="text"
            select="substring-after($text,$replace)" />
            <xsl:with-param name="replace" select="$replace" />
            <xsl:with-param name="by" select="$by" />
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$text" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    

    这是我在这里找到的一段代码:XSLT 1.0: Replacing all occurences of a string in a node-set

    代替

        <xsl:value-of select="CountryGroup"/>
    

    您可以尝试(根据以下建议进行编辑):

        <xsl:call-template name="string-replace-all">
          <xsl:with-param name="text" select="CountryGroup"/>
          <xsl:with-param name="replace" select="','"/>
          <xsl:with-param name="by" select="',&#8203;'"/>
        </xsl:call-template>
    

    对于零宽度空间,我使用了它的 Unicode &amp;#8203;。如果您使用其他编码,则需要对此进行调整。

    【讨论】:

    • 如何将该块集成到我的桌子中间?
    • 你有&lt;fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"&gt;&lt;fo:block&gt;&lt;xsl:value-of select="CountryGroup"/&gt;&lt;/fo:block&gt;&lt;/fo:table-cell&gt; 的地方可以放&lt;fo:table-cell border="1pt solid black" padding="3mm 0mm" display-align="center"&gt;&lt;fo:block wrap-option="wrap"&gt;&lt;xsl:value-of select="CountryGroup"/&gt;&lt;/fo:block&gt;&lt;/fo:table-cell&gt; 由于这完全不清楚,我将在上面编辑我的答案。
    • 感谢您的回答我已经调整了我的代码并重新生成了 pdf 文件但是不幸的是它仍然打破了单元格的边界
    • ",&amp;#8203" 更改为 "',&amp;#8203;'"。 @select 的值是一个 XPath 表达式,因此您需要将它作为字符串提供,并且您需要 ; 来完成 &amp;#8203; 数字字符引用。你的另一个选择是&lt;xsl:with-param name="by"&gt;&amp;#8203;&lt;/xsl:with-param&gt;,但这仍然需要;
    • 是否可以将, 替换为, (即添加一个普通空格)以使输出更具可读性?
    猜你喜欢
    • 2017-02-18
    • 2011-03-15
    • 2023-03-10
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多