3

セル内に大量のテキストを含む表を使用すると、スタイリングの問題に直面します。残念ながら、テキストが改ページで区切られていることがあります。次の図でわかるように、行 3 の段落1はページで分割されています。

**row3** のセル内での不運な改ページ

必要なのは、行 3、段落 1 、行 1が段落の残りの部分と一緒に次のページに配置されることです。

「孤児」や「未亡人」などの属性を使用してみましたが、テーブル セル内では効果がないようです。また、 keep-together属性のブロックを使用してみましたが、段落が 1 ページより大きくなり、コンテンツが途切れる可能性があります。他に考えられる唯一の方法は、行の最初の数段落で使用する fo:blocks でkeep-with-nextを使用することです。しかし、これはずさんで複雑で、経験則に近いものに見えます。

http://www.utilities-online.info/foprender/を使用してテストできる「最小限の」例をまとめました。解決策を教えていただければ幸いです。「孤児」と「未亡人」がここで機能しないように見える理由も教えてください。

前もって感謝します!

XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item>
        <heading>head1</heading>
        <description>
            <p>row1 paragraph1 line1
            row1 paragraph1 line2
            row1 paragraph1 line3
            row1 paragraph1 line4
            row1 paragraph1 line5</p>

            <p>row1 paragraph2 line1
            row1 paragraph2 line2
            row1 paragraph2 line3
            row1 paragraph2 line4</p>
        </description>
    </item>
    <item>
        <heading>head1</heading>
        <description>
            <p>row2 paragraph1 line1
            row2 paragraph1 line2
            row2 paragraph1 line3
            row2 paragraph1 line4
            row2 paragraph1 line5</p>

            <p>row2 paragraph2 line1
            row2 paragraph2 line2
            row2 paragraph2 line3
            row2 paragraph2 line4
            row2 paragraph2 line5
            row2 paragraph2 line6
            row2 paragraph2 line7</p>
        </description>
    </item>
    <item>
        <heading>head1</heading>
        <description>
            <p>row3 paragraph1 line1
            row3 paragraph1 line2
            row3 paragraph1 line3
            row3 paragraph1 line4
            row3 paragraph1 line5</p>

            <p>row3 paragraph2 line1
            row3 paragraph2 line2
            row3 paragraph2 line3
            row3 paragraph2 line4</p>
        </description>
    </item>
</root>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
    <xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>

    <xsl:template match="//root">
        <fo:root language="DE">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4-landscape" page-height="21cm" page-width="29.7cm" margin-top="5mm" margin-bottom="5mm" margin-left="5mm" margin-right="5mm">
                    <fo:region-body margin-top="25mm" margin-bottom="20mm"/>
                    <fo:region-before region-name="xsl-region-before" extent="25mm" display-align="before" precedence="true"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="A4-landscape">
                <fo:flow reference-orientation="0" border-collapse="collapse" flow-name="xsl-region-body">
                    <fo:table>
                        <fo:table-column column-width="80%"/>
                        <fo:table-body>
                            <xsl:apply-templates select="item"/>
                        </fo:table-body>
                    </fo:table>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="item">
        <fo:table-row>
            <fo:table-cell border="solid">
                <fo:block>
                    <xsl:value-of select="heading"/>
                </fo:block>
                <fo:block linefeed-treatment="preserve" orphans="4" widows="4">
                    <xsl:apply-templates select="description"/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="//description/p">
        <fo:inline><xsl:value-of select="text()"/></fo:inline>
    </xsl:template>
</xsl:stylesheet>

編集xml 入力に p-tag を追加しました。間違ったバージョンの xml を投稿しました。

4

1 に答える 1

1

あなたの入力を考えると、データが正確に設定されていない限り、おそらく運が悪く、空白行でデータを区切るために再帰を試みます。データがこれである場合 (XSL と驚くほど一致しますが、「p」要素はありません):

    <description>
        <p>row2 paragraph1 line1
        row2 paragraph1 line2
        row2 paragraph1 line3
        row2 paragraph1 line4
        row2 paragraph1 line5</p>
        <p>row2 paragraph2 line1
        row2 paragraph2 line2
        row2 paragraph2 line3
        row2 paragraph2 line4
        row2 paragraph2 line5
        row2 paragraph2 line6
        row2 paragraph2 line7</p>
    </description>

次に、「p」レベルでキープを適用して、コンテンツをまとめることができます。入力にはそれがないため、別個のブロックを作成し、description 要素の子である 1 つの text() ノードのそれらのブロックに keep を適用するテンプレートを作成する必要があります。

改行も意図している場合は、改行を保持する必要があります。

さて、あなたのデータが本当に書かれた通りであれば (改行と最終出力で一緒に暮らす個々の行で)、各行を table-row に入れ、 position を使用して一緒に保持したいいくつかを決定します.

于 2013-10-11T04:20:36.560 に答える