2009-03-03 9 views
0

Bei der Arbeit wurde mir die lustige Aufgabe gegeben, PDFs mit XSL zu erzeugen. Die XML-Struktur mit Ich arbeite ähnlichUpdate-Attribut in XSL for-each

<records> 
    <topLevel> 
     <topLevelID></topLevelID> 
     <secondLevel> 
      <secondLevelID></secondLevelID> 
      <thirdLevel> 
      </thirdLevel> 
      <thirdLevel> 
      </thirdLevel> 
     </secondLevel> 
    </topLevel> 
    <topLevel> 
     <topLevelID></topLevelID> 
     <secondLevel> 
      <secondLevelID></secondLevelID> 
      <thirdLevel> 
      </thirdLevel> 
      <thirdLevel> 
      </thirdLevel> 
     </secondLevel> 
    </topLevel> 
</records> 

Ich würde versuchen, ein aussagekräftigere Beispiel für die XML zu geben, aber ich fühle mich nicht wie alle rechtlichen Grenzen nähern, die bestehen kann. Mit dieser XML-Struktur muss ich einen Textblock in der PDF für jeden thirdLevel Knoten ausgeben. Die XSL ich bisher habe, ist wie

<xsl:for-each select ="topLevel">   
    <xsl:variable name="topID" select="topLevelID"/> 
    <xsl:for-each select ="secondLevel"> 
     <xsl:variable name="secondID" select="secondLevelID"/> 
     <xsl:for-each select="thirdLevel">    
      <fo:block-container position="absolute" height="12.8pt" width="220.8pt" left="160pt" display-align="auto"> 
       <xsl:attribute name="top"> 
        <xsl:value-of select="concat(193 + [whatshouldgohere]), 'pt')"/> 
       </xsl:attribute> 
       <fo:block font-size="7pt">       
        <xsl:call-template name="insertThirdLevel"/> 
       </fo:block> 
      </fo:block-container> 
     </xsl:for-each> 
    </xsl:for-each> 
</xsl:for-each> 

Grundsätzlich, ich brauche einen Wert nach oben Attribute hinzufügen den Text für jeden thirdLevel Knoten erscheinen zu lassen, in einer eigenen Zeile. Ich habe versucht, Kombinationen von Addieren/Multiplizieren mit der ID (beginnt bei 1 und erhöht sich um 1 für jeden Satz) und position(), aber ich kann nicht scheinen, es richtig zu machen.

+0

"concat ((193 * Position()), 'pt')" funktionieren sollte, wie Hast du Multiplikation gemacht? – annakata

+0

Das Problem, das ich bekam, ist, dass ich im Grunde drei verschiedene Positionen habe, die ich für die drei verschiedenen für jeden Level verwenden könnte. Mit der Art und Weise, wie die Daten in der XML-Datei angeordnet sind, scheint die Verwendung von position() dazu zu führen, dass der Text zeitweise über anderem Text ausgegeben wird. – bcasp

Antwort

2

Ich denke, Sie sollten wirklich in <xsl:apply-templates> suchen, kann es Ihnen viel Tipparbeit sparen.

Vereinfachte Version:

<xsl:variable name="line-height" select="10" /> 

<xsl:template match="/records"> 
    <xsl:apply-templates select="//thirdLevel" /> 
</xsl:template> 

<xsl:template match="thirdLevel"> 
    <xsl:variable name="top" select="193 + position() * $line-height" /> 
    <fo:block-container top="{concat($top , 'pt')}"> 
    <fo:block font-size="7pt">       
     <xsl:call-template name="insertThirdLevel"/> 
    </fo:block> 
    </fo:block-container> 
</xsl:template> 

<xsl:template name="insertThirdLevel"> 
    Third Level! 
</xsl:template> 

Vereinfachte Ausgabe ("fo" Namespace ausgeschlossen):

<fo:block-container top="203pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
<fo:block-container top="213pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
<fo:block-container top="223pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
<fo:block-container top="233pt"> 
    <fo:block font-size="7pt"> 
    Third Level! 
    </fo:block> 
</fo:block-container> 
+0

Danke! Ich habe viel darüber nachgedacht. Danke, dass du es für mich vereinfacht hast. – bcasp

+0

Das war schnell. Bitte. :-D – Tomalak