Обернуть ячейку таблицы длинным словом в FOP

У меня есть таблица в FOP, и она прекрасно работает, пока я не получаю очень длинное слово. Затем слово перезаписывает ячейку, заканчивающуюся в таблице. Я пробовал использовать опцию wrap-option="wrap" в ячейке таблицы и/или блоке ячейки, но это не сработало.

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

Теперь описанное выше работает


person Thevagabond    schedule 26.06.2013    source источник
comment
Чтобы помочь с вашим шаблоном, который пытается чередовать нулевые пробелы, покажите начальный тег <xsl:template> (начало) шаблона, который вы уже вставили, а также шаблон с именем intersperse-with-zero-spaces. Тогда было бы хорошо показать образец ввода (по крайней мере, один фрагмент с длинной строкой), ожидаемый вывод (FO) и фактический вывод.   -  person LarsH    schedule 26.06.2013
comment
Спасибо за публикацию примера данных и других стилей. В таблице стилей должны быть ошибки копирования/вставки... есть <xsl:param>, который должен встречаться только в начале шаблона, в середине шаблона. Таким образом, таблица стилей недействительна. Должно быть два шаблона? Кроме того, я еще не вижу шаблона с именем intersperse-with-zero-spaces; но, возможно, вы все еще добавляете его. Наконец, какой процессор XSLT вы используете — Xalan? XSLT 1.1 была заброшенной версией.   -  person LarsH    schedule 26.06.2013
comment
параметр xsl был удален из-за ошибки C&P, что я использую корзину newes FOP   -  person Thevagabond    schedule 26.06.2013
comment
ВОТ ЭТО вы нашли решение... ‹xsl:template name=intersperse-with-zero-spaces› необходимо добавить над строкой ‹xsl:param name=str/› верхний параметр необходим чтобы удалить и первый шаблон нужно было закрыть ... теперь он работает (исправлено см. выше)   -  person Thevagabond    schedule 26.06.2013
comment
Хорошо. Я удивлен, что ваш XSLT-процессор не выдал вам ошибку. Я добавлю часть решения моего комментария в свой ответ, чтобы вы могли его принять (щелкните галочку). :-)   -  person LarsH    schedule 26.06.2013


Ответы (3)


Одним из вариантов может быть разбиение длинного числа/слова на XSLT при преобразовании в FO. Вы должны решить, где вы хотите, чтобы он сломался.

См. также: XSL-FO пижон Длинный текст перетекает в соседние ячейки/блок, скрывая содержимое

Обновление (скопировано из комментария):

В таблице стилей должны быть ошибки копирования/вставки... есть <xsl:param>, который должен встречаться только в начале шаблона, в середине шаблона. Таким образом, таблица стилей недействительна. Должно быть два шаблона? Кроме того, я еще не вижу шаблона с именем intersperse-with-zero-spaces; но, возможно, вы все еще добавляете его.

Обновление 2:

Вышеупомянутое было исправлено в Вопросе.

Я предположил, что второй шаблон не может быть intersperse-with-zero-spaces, так как он вызывает этот шаблон. Мне и в голову не приходило, что это должен быть рекурсивный шаблон!

Кстати, если у вас есть возможность использовать XSLT 2.0, шаблон intersperse-with-zero-spaces можно заменить гораздо более эффективной заменой регулярного выражения.

person LarsH    schedule 26.06.2013
comment
Я пробовал это, но это не работает для меня. Я сейчас пытаюсь использовать пространство с нулевой шириной, но мне не очень повезло. См. Мое редактирование выше. - person Thevagabond; 26.06.2013
comment
Предыдущий комментарий относится к части ответа над первым обновлением. - person LarsH; 28.06.2013

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

Я тестировал, работает нормально.

person Prasad Bojanapu    schedule 22.10.2017

Добавьте 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">
person Sonu Prajapati    schedule 27.03.2015
comment
Расстановка переносов не имеет ничего общего с корректировкой пробелов и обычно не применяется к длинной числовой строке как к той, которая вызывает проблему. - person lfurini; 18.04.2015