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

#html #xml #xslt

Вопрос:

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

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

Кто-нибудь знает, почему это не видно?

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

 lt;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"gt;   lt;xsl:output indent="yes"/gt;   lt;xsl:variable name="svg-width" select="1200"/gt;  lt;xsl:variable name="svg-height" select="900"/gt;  lt;xsl:variable name="max-bar-length" select="$svg-width - 400"/gt;   lt;xsl:variable name="bar-height" select="20"/gt;  lt;xsl:variable name="bar-spacing" select="50"/gt;  lt;xsl:variable name="bar-start" select="200"/gt;   lt;xsl:variable name="bar-width1" select="gdp_agri"/gt;  lt;xsl:variable name="bar-width2" select="gdp_ind"/gt;  lt;xsl:variable name="bar-width3" select="gdp_serv"/gt;  lt;xsl:variable name="gdp_agri" select="gdp_agri"/gt;  lt;xsl:variable name="gdp_ind" select="gdp_ind"/gt;  lt;xsl:variable name="gdp_serv" select="gdp_serv"/gt;   lt;xsl:template match="/"gt;  lt;htmlgt;  lt;bodygt;  lt;svg viewBox="0 0 {$svg-width} {$svg-height}" width="{$svg-width}px" height="{$svg-height}px"gt;  lt;g id="bar-chart" font-size="16" transform="translate(20,100)"gt;  lt;xsl:apply-templates select="child::mondial/child::country[child::encompassed[attribute::continent='europe']]"gt;  lt;xsl:sort order="ascending" select="name"/gt;  lt;/xsl:apply-templatesgt;  lt;/ggt;  lt;/svggt;  lt;/bodygt;  lt;/htmlgt;  lt;/xsl:templategt;   lt;xsl:template match="country"gt;  lt;xsl:variable name="bar-width" select="gdp_agri"/gt;  lt;g id="bar_{position()}" transform="translate(0, {(position() - 1) * ($bar-height   $bar-spacing)})"gt;  lt;text x="0" y="{($bar-height   $bar-spacing) div 2}"gt;  lt;xsl:number format="1. " value="position()"/gt;  lt;xsl:value-of select="name"/gt;  lt;/textgt;  lt;rect x="{$bar-start}" y="0" width="{$bar-width}" height="{$bar-height}" fill="green"/gt;  lt;text x="{$bar-width  $bar-start   5}" y="{0.2*($bar-height   $bar-spacing) div 2}"gt;Agri GDP: lt;xsl:value-of select="gdp_agri"/gt;%lt;/textgt;  lt;/ggt;    lt;xsl:variable name="bar-width2" select="gdp_ind"/gt;  lt;g id="bar_{position()}" transform="translate(0, {(position() - 1) * ($bar-height   $bar-spacing)})"gt;  lt;text x="0" y="{($bar-height   $bar-spacing) div 2}"gt;  lt;xsl:number format="1. " value="position()"/gt;  lt;xsl:value-of select="name"/gt;  lt;/textgt;  lt;rect x="{$bar-start}" y="20" width="{$bar-width2}" height="{$bar-height}" fill="brown"/gt;  lt;text x="{$bar-width2  $bar-start   5}" y="{($bar-height   $bar-spacing) div 2}"gt;Ind GDP: lt;xsl:value-of select="gdp_ind"/gt;%lt;/textgt;  lt;/ggt;    lt;xsl:variable name="bar-width3" select="gdp_serv"/gt;  lt;g id="bar_{position()}" transform="translate(0, {(position() - 1) * ($bar-height   $bar-spacing)})"gt;  lt;text x="0" y="{($bar-height   $bar-spacing) div 2}"gt;  lt;xsl:number format="1. " value="position()"/gt;  lt;xsl:value-of select="name"/gt;  lt;/textgt;  lt;rect x="{$bar-start}" y="40" width="{$bar-width3}" height="{$bar-height}" fill="yellow"/gt;  lt;text x="{$bar-width3  $bar-start   5}" y="{($bar-height   $bar-spacing) div 1.2}"gt;Serv. GDP: lt;xsl:value-of select="gdp_serv"/gt;%lt;/textgt;  lt;/ggt;  lt;/xsl:templategt;  lt;/xsl:stylesheetgt;  

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

Комментарии:

1. Ну, SVG-это не текучий контент, а ваш-900 пикселей в высоту.

2. это не конкретный вопрос для существующей базы данных

Ответ №1:

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

 lt;xsl:template match="/"gt;  lt;htmlgt;  lt;bodygt;  lt;xsl:apply-templates select="child::mondial/child::country[child::encompassed[attribute::continent='europe']]"gt;  lt;xsl:sort order="ascending" select="name"/gt;  lt;/xsl:apply-templatesgt;  lt;/bodygt;  lt;/htmlgt; lt;/xsl:templategt;  lt;xsl:template match="country"gt;  lt;svg viewBox="0 0 {$svg-width} {$svg-height}" width="{$svg-width}px" height="{$svg-height}px"gt;  lt;g id="bar-chart" font-size="16" transform="translate(20,100)"gt;  lt;!-- place adapted code of existing template match="country" here --gt;  lt;/ggt;  lt;/svggt; lt;/xsl:templategt;  

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