Update-Attribut in XSL for-each
-
03-07-2019 - |
Frage
Bei der Arbeit Ich habe die Spaß Aufgabe der Erzeugung von PDF-Dateien mit XSL gegeben. Die XML-Struktur Ich arbeite mit ähnelt
<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 keine rechtlichen Grenzen wie nähern, die bestehen kann. Mit dieser XML-Struktur, ich habe einen Textblock in der PDF für jeden thirdLevel
Knoten ausgegeben wird. 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>
Im Grunde brauche ich etwas Wert nach oben Attribute hinzufügen den Text für jeden thirdLevel
Knoten zu machen, in einer eigenen Zeile angezeigt. Ich habe versucht, Kombinationen von Additions- / Multiplikation mit der ID (beginnt bei 1 und erhöht sich um 1 für jeden Satz) mit und position()
, aber ich kann nicht scheinen, richtig zu machen.
Lösung
Ich glaube, Sie wirklich in <xsl:apply-templates>
aussehen sollen, kann es Ihnen eine Menge 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>