Проблема переноса слов в XSL - PullRequest
0 голосов
/ 27 марта 2020

У меня есть таблица, закодированная в XSL, которая используется для генерации PDF при выполнении. Существует проблема, когда пользователь вводит данные в ячейку таблицы CountryGroup. Если в данных нет пробелов, это нарушит границы ячейки, и данные попадут в другие ячейки, что сделает документ нечитаемым.

Я пытаюсь найти способ сделать перенос текста. Пожалуйста, посмотрите фрагмент кода ниже:

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

1 Ответ

0 голосов
/ 27 марта 2020

Если вы хотите, чтобы блок переносился в несколько строк, когда в тексте нет пробелов, попробуйте определить атрибут от 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. Длинный текст течет в соседние ячейки / блок, скрывая там вещи

Если это не сработает, вы можете вставить пробелы нулевой ширины в свой блок, надеясь, что это поможет обернуть ваш текст в несколько строк :

<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: замена всех вхождений строки в наборе узлов

вместо

    <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 &#8203;. Если вы работаете с другой кодировкой, вам необходимо настроить это.

...