Announcement

Collapse
No announcement yet.

xsl-fo: dynamischer page break

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • xsl-fo: dynamischer page break

    Hallo,

    ich habe folgendes Problem und hoffe auf Lösungsvorschläge oder weitere Denkanstösse:

    Ich erstelle aus Matlab heraus zwei Reports. Dafür generiert mir Matlab ein XML und ich benutze xsl-fo dann als style sheet für die Darstellung der Reports als pdf-Datei. Jetzt möchte ich ein xsl-fo template für beide reports benutzen, damit änderungen möglichst schnell und ohne viel Aufwand für beide Reports gelten. Das Problem ist, dass ich in dem einen Report eine komplette Tabelle auf einer Seite haben möchte und benutze dafür keep-together.within-page = "always". Der andere Report hat aber so grosse Tabellen, dass sie nicht auf eine Seite passen. Also bekomme ich einen overflow. Ausserdem sollen dann nur bestimmte Tabellenzeilen auf einer Seite sein (Die Zeilen sind thematisch zugeordnet und diese Themen sollen auf einer Seite bleiben). Das habe ich mit keep-with-previous hinbekommen. Aber jetzt versagt es, beide Ansprüche zusammen zu bekommen. Eigentlich möchte ich nicht zwei verschiedene templates für Tabellen im xsl-fo file haben.


    Code:
    <xsl:template match="table">
    		
    		
    	<fo:block span="all" space-before="1.5cm" space-after="1.5cm" start-indent="4%">
    
    		<fo:block font-size="10pt" space-after="3mm">
    			<xsl:text>Table </xsl:text>
    			<xsl:value-of select="1 + count(preceding::chapter)" />
    			<xsl:text>.</xsl:text>
    
    			
    			<xsl:if test="parent::chapter">
    				<xsl:value-of select="count(preceding-sibling::table)  
    					+ count(preceding-sibling::section/descendant::table)
    					- count(preceding-sibling::section/descendant::elementrow/table)
    					+1" />	
    						
    			</xsl:if>
    
    			<xsl:if test="parent::section">
    				<xsl:value-of select="count(preceding-sibling::table)
    					+ count(preceding-sibling::subesction/descendant::table)
    					- count(preceding-sibling::subesction/descendant::elementrow/table)
    					+ count(parent::*/preceding-sibling::table)	
    					+ count(parent::*/preceding-sibling::section/descendant::table)
    					- count(parent::*/preceding-sibling::section/descendant::elementrow/table)
    				 	+ 1" />
    			</xsl:if>
    
    			<xsl:if test="parent::subsection">
    				<xsl:value-of select="count(preceding-sibling::table)
    					+ count(parent::*/preceding-sibling::table)
    					+ count(parent::*/preceding-sibling::subsection/descendant::table)
    					- count(parent::*/preceding-sibling::subsection/descendant::elementrow/table)
    					+ count(parent::*/parent::*/preceding-sibling::table)
    					+ count(parent::*/parent::*/preceding-sibling::section/descendant::table)
    					- count(parent::*/parent::*/preceding-sibling::section/descendant::elementrow/table)
    					+1" />
    			</xsl:if>	
    
    			<xsl:text>: </xsl:text>
    			<xsl:value-of select="@title" /> 
    		</fo:block>
    		
        	<fo:block>
    			
    			<fo:block>
    				<fo:table table-layout="fixed" space-after="3mm">
    					<xsl:attribute name="width">
    						<xsl:choose>
    							<xsl:when test="count(./tabledataset[1]/@*)=2">60%</xsl:when>
    							<xsl:when test="count(./tabledataset[1]/@*)=3">70%</xsl:when>
    							<xsl:when test="count(./tabledataset[1]/@*)=4">80%</xsl:when>
    							<xsl:when test="count(./tabledataset[1]/@*)=5">90%</xsl:when>
    							<xsl:otherwise>96%</xsl:otherwise>
    						</xsl:choose>
    					</xsl:attribute>
    					<fo:table-column column-width="proportional-column-width(1)">
    						<xsl:attribute name="number-columns-repeated">
    							<xsl:value-of select="count(./tabledataset[1]/@*)" />
    						</xsl:attribute>
    					</fo:table-column>
    					<fo:table-header start-indent="0%">
    						<xsl:apply-templates select="tableheader" />
    					</fo:table-header>
    					<fo:table-body start-indent="0%">
    						<xsl:apply-templates select="tabledataset" />
    					</fo:table-body>
    				</fo:table>
    			</fo:block>
    			
    			<fo:block-container start-indent="2%">
    				<xsl:attribute name="width">
    						<xsl:choose>
    							<xsl:when test="count(./tabledataset[1]/@*)=2">68%</xsl:when>
    							<xsl:when test="count(./tabledataset[1]/@*)=3">78%</xsl:when>
    							<xsl:when test="count(./tabledataset[1]/@*)=4">88%</xsl:when>
    							<xsl:when test="count(./tabledataset[1]/@*)=5">100%</xsl:when>
    							<xsl:otherwise>100%</xsl:otherwise>
    						</xsl:choose>
    				</xsl:attribute>
    				<fo:block font-size="8pt" text-align="justify" end-indent='7%' wrap-option="wrap">
    					<xsl:value-of select="@caption" /> 
    				</fo:block>
    			</fo:block-container>
    		</fo:block>
    		
    	</fo:block>
    </xsl:template>
    Wenn ich im ersten fo:block das attribute keep-together.within-page auf always setze, bekomme ich Probleme mit dem zweiten Report wegen overflow.

    Den folgenden Code nutze ich damit die thematischen Bereiche in der Tabelle des zweiten Codes zusammen bleiben. Das kann ich dann in Matlab passen setzen.

    Code:
    <xsl:if test="formatrow/@keepwithprevious">
    		<xsl:attribute name="keep-with-previous">
    			<xsl:value-of select="formatrow/@keepwithprevious"/>
    		</xsl:attribute>
    	</xsl:if>
    Ich hoffe, mein Problem ist ein bisschen verständlich geworden. In short: ich will dynamisch entscheiden, ob die ganze Tabelle auf einer Seite bleiben soll oder nicht. Und diese Entscheidung treffe ich in Matlab und setze es dann nach XML um und xsl-fo sieht es und macht es passend im pdf-file.

    Vielen Dank schonmal
Working...
X