2009-03-03 18 views
0

私はXSLでPDFを生成するという面白い仕事をしています。私が働いているXML構造は、私はXMLのより有意義な例を与えることをしようとするだろうが、私は存在してもよい法的な境界線に近づいように感じることはありません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> 

に似ています。そのXML構造では、すべてのthirdLevelノードのPDFにテキストのブロックを出力する必要があります。私がこれまで持っているXSLは基本的に、私は各thirdLevelノードのテキストを独自の行に表示させるために、トップ属性に何らかの値を追加する必要が

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

のようなものです。私はIDを追加/乗算(1から始まり、各セットごとに1ずつ増加する)とposition()の組み合わせを試してみましたが、それを正しく得ることはできません。

+0

"CONCAT((193 *の位置())、 'PT')" 動作するはずです、どのように乗算をしていたのですか? – annakata

+0

私が遭遇した問題は、基本的に私が3つの異なるfor-eachレベルに使用できる3つの異なるポジションを持っていることです。また、データがXMLにレイアウトされる方法では、position()を使うだけで、テキストが他のテキストの上に出力されるように見えることがあります。 – bcasp

答えて

2

私はあなたが実際に<xsl:apply-templates>を見てくださいと思う、それはあなたに多くのタイピングを保存することができます。

簡体字版:

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

簡体出力(除外名前空間 "FO"):

<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

ありがとう!私はこれをたくさん思っていました。私のためにそれを簡素化してくれてありがとう。 – bcasp

+0

すぐにそれは速かった。どういたしまして。 :-D – Tomalak