XSL-FO, оборачивающий длинный текст в ячейки таблицы - PullRequest
0 голосов
/ 29 апреля 2020

Я экспортирую в pdf таблицу, сгенерированную во время выполнения в Oracle APEX, используя XSL-FO для шаблона запроса отчета. К сожалению, длинные слова внутри ячеек не обернуты, и они перекрывают соседнюю ячейку, делая отчет действительно уродливым и бесполезным. Как это можно решить? ПРИМЕЧАНИЕ: я знаю, что эти вопросы уже задавались много раз. Моя проблема в том, что ни одно из найденных мной решений не работает. В частности, я реализую то, что нашел здесь: XSL-FO: принудительное наложение на записи таблицы

С этим решением ничего не происходит. Я попытался вставить команду для красного текста внутри шаблона, чтобы проверить, работает ли он, но ответ - нет. Вы можете заметить, что я тоже пытался использовать «дефис» и «вариант переноса», как видно из других ответов на проблему, но безуспешно. Как я могу это исправить? Правильно ли расположен шаблон для «промежутков между нулями»?

Это мой код:

 <xsl:stylesheet xmlns:fox="http://xml.apache.org/fop/extensions" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://icl.com/saxon" extension-element-prefixes="saxon" >
    <xsl:variable name="_XDOFOPOS" select="''"/>
    <xsl:variable name="_XDOFOPOS2" select="number(1)"/>
    <xsl:variable name="_XDOFOTOTAL" select="number(1)"/>
    <xsl:variable name="_XDOFOOSTOTAL" select="number(0)"/>

    <!-- VARIOUS OTHER ATTRIBUTES HERE  -->

    <xsl:attribute-set name="cell">
        <xsl:attribute name="background-color">#BODY_BG_COLOR#</xsl:attribute>     
        <xsl:attribute name="color">#BODY_FONT_COLOR#</xsl:attribute>
        <xsl:attribute name="padding-start">5.15pt</xsl:attribute>
        <xsl:attribute name="vertical-align">top</xsl:attribute>
        <xsl:attribute name="padding-top">0.0pt</xsl:attribute>
        <xsl:attribute name="padding-end">5.15pt</xsl:attribute>
        <xsl:attribute name="number-columns-spanned">1</xsl:attribute>
        <xsl:attribute name="height">0.0pt</xsl:attribute>
        <xsl:attribute name="padding-bottom">0.0pt</xsl:attribute>
                <xsl:attribute name="font-style">italic</xsl:attribute>
                <xsl:attribute name="color">blue</xsl:attribute>
        <xsl:attribute name="hyphenate">true</xsl:attribute>
        <xsl:attribute name="wrap-option">wrap</xsl:attribute>
    </xsl:attribute-set>
    <xsl:attribute-set name="header-color">
        <xsl:attribute name="background-color">#HEADER_BG_COLOR#</xsl:attribute>
        <xsl:attribute name="color">#HEADER_FONT_COLOR#</xsl:attribute>
    </xsl:attribute-set>


    <!-- Trying this to wrap long words   -->

    <xsl:template match="text()">    
        <xsl:call-template name="intersperse-with-zero-spaces">
            <xsl:with-param name="str" select="."/>
                <xsl:attribute name="color">red</xsl:attribute>
        </xsl:call-template>
    </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>  
    <!-- long word wrap end  -->


    <xsl:template match="DOCUMENT"> 
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <!-- OTHER STUFF AND THE TABLE ... -->                      

        </fo:root>
    </xsl:template>

</xsl:stylesheet>

1 Ответ

1 голос
/ 29 апреля 2020

Чтобы увидеть, используется ли шаблон, измените:

<xsl:value-of select="$c1"/>

на:

<fo:inline color="red"><xsl:value-of select="$c1"/></fo:inline>

Чтобы увидеть эффект шаблона, измените &#x200B; в <xsl:text>&#x200B;</xsl:text> на печать символ, например, .. Вы получите еще больше переполненных ячеек таблицы, но вы поймете, почему.

...