Announcement

Collapse
No announcement yet.

for-schleife zählvariable

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

  • for-schleife zählvariable

    Hi,
    das ist mein erster Beitrag hier und ich habe noch nie in meinem Leben xsl programmiert. Ich sitze hier in der Arbeit (Werkstudent) und muss aushelfen da der Main-Programmer weg ist. Jetzt muss ich hier etwas lösen mit xsl und habe keine Ahnung davon, und jetzt auch nicht die Zeit gross Tutorials usw zu lesen.

    ...soviel zum Vorwort, es sei mir also verziehen dass ich hier nach einer Lösung frage "ohne Vorarbeit" o.ä.

    Es ist schnell gesagt: Ich brauche einen Zähler in einer Schleife. Durch googlen habe ich schon gemerkt, dass es sowas nicht gibt, man es aber über call-templates machen kann.

    Ich hab mir einige Codes rausgesucht und jetzt ewig rumprobiert, und bin am verzweifeln!!

    Hier erstmal mein Versuch:

    Code:
    	<xsl:template name="loop">
    		<xsl:param name="index">1</xsl:param>
    		<xsl:param name="max">3</xsl:param>
    		<xsl:if test="$index &lt; $max">
    			<fo:block font-size="12pt" page-break-after="always"></fo:block>
    		</xsl:if>
    	</xsl:template>
    Code:
    <xsl:template match="document">
    		<fo:page-sequence master-reference="center">
    			<fo:static-content flow-name="xsl-region-after">
    				<xsl:call-template name="tableFooter" />
    			</fo:static-content>
    			<fo:flow flow-name="xsl-region-body" font-family="Helvetica"
    				font-size="9pt">
    
    				<!-- CONTENT DER PDF -->
    				<xsl:for-each select="page">
    					<xsl:call-template name="tableHeadline" />
    					<xsl:for-each select="./table">
    						<xsl:apply-templates select="." />
    					</xsl:for-each>
    
    					<xsl:call-template name="loop">
    						<xsl:with-param name="index">
    							<xsl:value-of select="$index + 1" />
    						</xsl:with-param>
    
    					</xsl:call-template>
    				</xsl:for-each>
    				<!-- CONTENT ENDE -->
    
    			</fo:flow>
    		</fo:page-sequence>
    	</xsl:template>
    Also was passieren soll: Bei einem PDF muss ein Seitenumbruch passieren, allerdings nicht nach dem letzten element der for-each Schleife. In dem oberen Template ("document") lad ich halt alles mögliche rein, und wollte eben am ende des jeweiligen schleifendurchgang mein loop-template callen.
    Allerdings klatscht er mir noch immer auch nach der letzten Seite eine neue (leere) ins PDF.

    Bitte helft mir... wie gesagt ich kenne mich null damit aus und habs jetzt nur rein von der Logik her versucht, aber nix geht.

    Mit Bsp die ich bisher gefunden hab ist obiges rausgekommen, ich brauch echt eine 1:1 Anweisung wie das geht, ich kann xls gar nicht..

    Ich entschuldige mich nochmal dafür, aber mir brennt's hier echt unter'm Ar***, ich bin eig. Java-Programmierer und halt mich jetzt schon seit 3 Stunden an dem Zeug hier auf...

    Vielen vielen lieben Dank schon mal!!

  • #2
    habe mit xsl:fo keine Erfahrung
    kleine xml zum testen

    <?xml version="1.0" encoding="UTF-8"?>

    <root>
    <aa>das</aa>
    </root>

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xslutput method="xml" indent="yes"/>
    <xsl:template match="/">
    <root>
    <xsl:apply-templates select="root"/>
    </root>
    </xsl:template>
    <xsl:template match="root">
    <xsl:call-template name="zählen">
    <xsl:with-param name="anfang" select="1"/>
    <xsl:with-param name="ende" select="10"/>
    </xsl:call-template>
    </xsl:template>
    <xsl:template name="zählen">
    <xslaram name="anfang"></xslaram>
    <xslaram name="ende"></xslaram>
    <xsl:if test="$anfang &lt;=$ende">
    <test>
    <xsl:attribute name="id"><xsl:value-of select="$anfang"/></xsl:attribute>
    <xsl:value-of select="$anfang"/>
    </test>
    <xsl:call-template name="zählen">

    <xsl:with-param name="anfang" select="$anfang + 1"/>
    <xsl:with-param name="ende" select="$ende"/>
    </xsl:call-template>

    </xsl:if>
    </xsl:template>
    </xsl:stylesheet>
    ergebnis nach transformation
    <?xml version="1.0" encoding="utf-8"?>
    <root>
    <test id="1">1</test>
    <test id="2">2</test>
    <test id="3">3</test>
    <test id="4">4</test>
    <test id="5">5</test>
    <test id="6">6</test>
    <test id="7">7</test>
    <test id="8">8</test>
    <test id="9">9</test>
    <test id="10">10</test>
    </root>
    ist eine Rekursion ich denke man mus sie in for each einbauen
    vieleicht besser erklären dann kann ich es nach vollziehen
    email schicken was da ist und was rauskommen soll

    Helmut Hagemann

    Comment


    • #3
      Hey, danke erstmal. Das Problem war dass ich selber eine for-each schleife hatte und das per Rekursion eig. nicht lösen konnte. Weil die for-each sonst jedesmal von vorne beginnen würde.

      Ich hab das jetzt aber per Probieren ganz einfach lösen können:

      statt ein page-break-after=always reicht ein page-break-before=always, denn im Gegensatz zu der after-Version, schnallt die before-Version wenn es noch kein Element gibt (1.Element der for-each), und macht keinen Seitenumbruch.

      Comment

      Working...
      X