Выходные данные преобразования XSLT показывают только 1-ю страницу, а график обрезан

Итак, я применил XSLT к XML-коду и заставил его показать нужный мне результат.

отображается полный код XML, но когда я печатаю его как html / pdf, отображается только 1-я страница, а нижняя часть обрезается.

Кто-нибудь знает, почему не отображается?

для справки это мой код XSLT

      <xsl:stylesheet xmlns="http://www.w3.org/2000/svg" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0">

    <xsl:output indent="yes"/>

    <xsl:variable name="svg-width" select="1200"/>
    <xsl:variable name="svg-height" select="900"/>
    <xsl:variable name="max-bar-length" select="$svg-width - 400"/>

    <xsl:variable name="bar-height" select="20"/>
    <xsl:variable name="bar-spacing" select="50"/>
    <xsl:variable name="bar-start" select="200"/>

    <xsl:variable name="bar-width1" select="gdp_agri"/>
    <xsl:variable name="bar-width2" select="gdp_ind"/>
    <xsl:variable name="bar-width3" select="gdp_serv"/>
    <xsl:variable name="gdp_agri" select="gdp_agri"/>
    <xsl:variable name="gdp_ind" select="gdp_ind"/>
    <xsl:variable name="gdp_serv" select="gdp_serv"/>

    <xsl:template match="/">
        <html>
            <body>
                <svg viewBox="0 0 {$svg-width} {$svg-height}" width="{$svg-width}px" height="{$svg-height}px">
                    <g id="bar-chart" font-size="16" transform="translate(20,100)">
                        <xsl:apply-templates select="child::mondial/child::country[child::encompassed[attribute::continent='europe']]">
                         <xsl:sort order="ascending" select="name"/>
                        </xsl:apply-templates>
                    </g>
                </svg>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="country">
        <xsl:variable name="bar-width" select="gdp_agri"/>
        <g id="bar_{position()}" transform="translate(0, {(position() - 1) * ($bar-height + $bar-spacing)})">
            <text x="0" y="{($bar-height + $bar-spacing) div 2}">
                <xsl:number format="1. " value="position()"/>
                <xsl:value-of select="name"/>
            </text>
            <rect x="{$bar-start}" y="0" width="{$bar-width}" height="{$bar-height}" fill="green"/>
            <text x="{$bar-width +$bar-start + 5}" y="{0.2*($bar-height + $bar-spacing) div 2}">Agri GDP: <xsl:value-of select="gdp_agri"/>%</text>
        </g>
        
         <xsl:variable name="bar-width2" select="gdp_ind"/>
        <g id="bar_{position()}" transform="translate(0, {(position() - 1) * ($bar-height + $bar-spacing)})">
            <text x="0" y="{($bar-height + $bar-spacing) div 2}">
                <xsl:number format="1. " value="position()"/>
                <xsl:value-of select="name"/>
            </text>
            <rect x="{$bar-start}" y="20" width="{$bar-width2}" height="{$bar-height}" fill="brown"/>
            <text x="{$bar-width2 +$bar-start + 5}" y="{($bar-height + $bar-spacing) div 2}">Ind GDP: <xsl:value-of select="gdp_ind"/>%</text>
        </g>
        
        <xsl:variable name="bar-width3" select="gdp_serv"/>
        <g id="bar_{position()}" transform="translate(0, {(position() - 1) * ($bar-height + $bar-spacing)})">
            <text x="0" y="{($bar-height + $bar-spacing) div 2}">
                <xsl:number format="1. " value="position()"/>
                <xsl:value-of select="name"/>
            </text>
            <rect x="{$bar-start}" y="40" width="{$bar-width3}" height="{$bar-height}" fill="yellow"/>
            <text x="{$bar-width3 +$bar-start + 5}" y="{($bar-height + $bar-spacing) div 1.2}">Serv. GDP: <xsl:value-of select="gdp_serv"/>%</text>
        </g>
    </xsl:template>

</xsl:stylesheet>

Когда я применяю преобразование позже, оно выполняется, однако отображается только первая страница вывода. Остальные страны, в которых я работаю, не отображаются (это база данных mondial); они появляются в выводе XML, но не когда я печатаю как html / pdf или даже в выводе exist-DB

1 ответ

Решение

Вы создаете одно большое изображение, попробуйте разбить его на части, чтобы можно было использовать разрывы страниц. Я могу только догадываться, как это будет работать, потому что вы не предоставили данные xml. Должно быть так:

      <xsl:template match="/">
    <html>
        <body>
            <xsl:apply-templates select="child::mondial/child::country[child::encompassed[attribute::continent='europe']]">
                <xsl:sort order="ascending" select="name"/>
            </xsl:apply-templates>
        </body>
    </html>
</xsl:template>

<xsl:template match="country">
    <svg viewBox="0 0 {$svg-width} {$svg-height}" width="{$svg-width}px" height="{$svg-height}px">
        <g id="bar-chart" font-size="16" transform="translate(20,100)">
            <!-- place adapted code of existing template match="country" here -->
        </g>
    </svg>
</xsl:template>

Таким образом вы создаете разные svg-изображения для каждой страны. Возможно, вам придется повозиться с $svg-width, $svg-height и координатами. С другой стороны, управление координатами становится проще, потому что диаграмма для каждой страны всегда начинается вверху изображения. Из коробки это не сработает, но даст представление о том, как решить вашу проблему.

Другие вопросы по тегам