2009-03-03 15 views
0

Au travail, j'ai eu la tâche amusante de générer des fichiers PDF avec XSL. La structure XML Je travaille avec est similaire àAttribut de mise à jour dans XSL pour chaque

<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> 

Je voudrais essayer de donner un exemple plus significatif du XML, mais je ne me sens pas comme approche de frontières juridiques qui peuvent exister. Avec cette structure XML, je dois sortir un bloc de texte dans le PDF pour chaque nœud thirdLevel. Je XSL jusqu'à présent est comme

<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> 

Fondamentalement, je dois ajouter une certaine valeur à l'attribut haut pour rendre le texte pour chaque nœud thirdLevel apparaît sur sa propre ligne. J'ai essayé d'utiliser des combinaisons d'ajout/multiplication par l'ID (commence à 1 et augmente de 1 pour chaque ensemble) et position(), mais je ne peux pas sembler avoir raison.

+0

"concat ((193 * Position()), 'pt')" devrait fonctionner, comment faisiez-vous de la multiplication? – annakata

+0

Le problème que j'ai rencontré est que j'ai essentiellement trois positions différentes que je pourrais utiliser pour les trois différents pour chaque niveau. De plus, avec la façon dont les données sont disposées dans le XML, l'utilisation de position() semble provoquer la sortie du texte par-dessus le reste du texte. – bcasp

Répondre

2

Je pense que vous devriez vraiment regarder dans <xsl:apply-templates>, il peut vous faire économiser beaucoup de frappe.

Version simplifiée:

<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> 

sortie simplifiée ("fo" espace de noms exclu):

<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

Merci! J'en pensais beaucoup trop. Merci de l'avoir simplifié pour moi. – bcasp

+0

Maintenant, c'était rapide. Vous êtes les bienvenus. :-RÉ – Tomalak