3 Stimmen

fo:data-cell overflow

Ich verwende XSLT -> FO, um das PDF zu erzeugen.

Wenn der Text in einer Spalte die Größe der Spalte überschreitet und keine Leerzeichen im Text vorhanden sind, läuft der Text in die nächste Zelle oder außerhalb der Tabelle über.

Ich möchte, dass der Text innerhalb der gleichen Zelle belegt wird.

Vielen Dank im Voraus, Swetha

5voto

Juris Punkte 1447

Sie können den Text in Wörter aufteilen, indem Sie Leerzeichen mit einer Breite von Null einfügen (U+200B, HTML-Entität ), dann werden die Zeilenumbrüche an diesen Positionen erfolgen:

<xsl:template name="split_value">
    <xsl:param name="value"/>
    <xsl:param name="max_length"/>
    <xsl:variable name="ret">
        <xsl:value-of select="substring($value, 1, $max_length)"/>
        <xsl:if test="string-length($value) &gt; $max_length">
            <xsl:value-of select="'&#x200b;'"/>
            <xsl:call-template name="split_value">
                <xsl:with-param
                    name="value"
                    select="substring($value, $max_length + 1)"
                />
                <xsl:with-param
                    name="max_length"
                    select="$max_length"
                />
            </xsl:call-template>
        </xsl:if>
    </xsl:variable>
    <xsl:value-of select="$ret"/>
</xsl:template>

Hinweis: Sie können die Vorlage so erweitern, dass sie nur Textstücke aufteilt, bei denen zwischen $max_length fortlaufenden Zeichen keine Leerzeichen stehen.


Hier ist ein Testfall.

Eingabe XML:

<data>0123456789</data>

Stylesheet (erzeugt HTML):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    exclude-result-prefixes="xsl"
>
<xsl:template match="/">
    <html>
        <body
            style="font-family: Arial; font-size: 12pt; font-weight: normal"
        >
            <table width="4cm">
            <xsl:for-each select="/data">
                <tr><td>
                <xsl:call-template name="split_value">
                    <xsl:with-param
                        name="value"
                        select="text()"
                    />
                    <xsl:with-param
                        name="max_length"
                        select="number(4)"
                    />
                </xsl:call-template>
                </td>
                </tr>
            </xsl:for-each>
            </table>
        </body>
    </html>
</xsl:template>
</xsl:stylesheet>

0voto

SO User Punkte 22342

Wenn möglich, schneiden Sie die zusätzlichen Buchstaben ab. Verwenden Sie die Funktionen length() und substring() von xslt. Sie können auch einen Tooltip oder etwas anderes bereitstellen, um den gesamten Text anzuzeigen, wenn Sie ihn abschneiden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X