Обтекание таблицы в PDF с использованием XSLT, размер которой превышает размер страницы - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь разместить таблицу из нескольких столбцов на основе файла XML на стандартной странице формата A4.Проблема в том, что столбец, который превышает поле, не появляется в сгенерированном файле (как и ожидалось).Я хочу, чтобы внешние столбцы появились в следующем ряду, однако я не могу найти способ сделать это.Я пытался просто изменить размер шрифта или ориентацию страницы, но эти решения - просто обходной путь, который потерпит неудачу, когда число столбцов будет больше.Возможно ли это сделать с помощью простого XSLT 1.0?Мой код выглядит следующим образом:

<?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 method="xml" version="1.0" encoding="UTF-8"/>

<xsl:template match="/">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="A4" page-height="29cm" page-width="21cm"
                margin-bottom="2cm" margin-top="2cm" margin-left="1.5cm" margin-right="1.5cm">
                <fo:region-body margin-top="1cm"/>
                <fo:region-before extent="1.5cm"/>
                <fo:region-after extent="1.5cm"/>
            </fo:simple-page-master>
        </fo:layout-master-set>

        <fo:page-sequence master-reference="A4">


            <fo:static-content flow-name="xsl-region-before">
                <fo:block>Stylistique suppliers report. Generated <xsl:value-of
                        select="report/statistics/dateOfGeneration"/></fo:block>
            </fo:static-content>
            <fo:static-content flow-name="xsl-region-after">
                <fo:block>Page <fo:page-number/></fo:block>
            </fo:static-content>

            <fo:flow flow-name="xsl-region-body">
                <fo:block>
                    <fo:external-graphic src="logo.jpg" width="auto" height="auto"
                        content-height="300px"/>
                </fo:block>

                <fo:block linefeed-treatment="preserve">Summary table</fo:block>
                <fo:table>
                    <xsl:for-each select="report/suppliers/supplier">
                        <fo:table-column column-width="30mm"/>
                    </xsl:for-each>

                    <fo:table-header>
                        <fo:table-row>
                            <xsl:for-each select="report/suppliers/supplier">

                                <fo:table-cell>
                                    <fo:block font-weight="bold" width="30mm" font-size="8px">
                                        <xsl:value-of select="name"/>
                                    </fo:block>
                                </fo:table-cell>
                            </xsl:for-each>
                        </fo:table-row>
                    </fo:table-header>

                    <fo:table-body>

                        <fo:table-row>
                            <xsl:for-each select="report/suppliers/supplier">
                                <fo:table-cell>
                                    <xsl:for-each select="productList/product">
                                        <fo:block>
                                            <xsl:value-of select="name"/>
                                        </fo:block>
                                        <fo:block>
                                            <xsl:value-of select="priceInPLN"/>
                                        </fo:block>

                                    </xsl:for-each>
                                </fo:table-cell>

                            </xsl:for-each>
                        </fo:table-row>

                    </fo:table-body>
                </fo:table>

            </fo:flow>

        </fo:page-sequence>
    </fo:root>
</xsl:template>

</xsl:stylesheet>

1 Ответ

0 голосов
/ 08 декабря 2018

Подделка таблицы с использованием fo:block для строк таблицы и fo:inline-container (с фиксированной шириной) для каждой ячейки таблицы.

У вас могут возникнуть проблемы с получением «ячеек» одинаковой высоты, но то, что вы хотите сделать, находится вне области действия fo:table.

В качестве альтернативы, если вы точно знаете, где должна разбиваться таблица, вы можете опустить fo:table-row и использовать starts-row и ends-row свойства fo:table-cell, чтобы вызвать ваши разрывы.


Поскольку вы используете XSLT 1.0 и знаете ширину ячеек таблицы, вы можете использовать мюнхенскую группировку (https://stackoverflow.com/search?q=muenchian) длясгруппируйте соответствующее количество ячеек в строке. (Это было бы на намного проще, если бы вы использовали XSLT 2.0 или XSLT 3.0 и могли использовать xsl:for-each-group.)

Кроме того, есть несколько ответов SOвопросы об обтекании текста в ячейках таблицы, в том числе:

(Перенос текста также будет симpler, если вы использовали XSLT 2.0 или XSLT 3.0 (или AH Formatter, FWIW).См. Например, https://stackoverflow.com/a/33689540/4092205.)

...