2009-03-03 16 views
0

Çalışmaya, XSL ile PDF oluşturmanın eğlenceli görevi verildi. Ben ile çalışıyorum XML yapısıHer biri için XSL'deki güncelleştirme özniteliği

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

Ben bir XML daha anlamlı bir örnek vermek çalışacaktı benzer, ama var olabilecek herhangi bir yasal sınırları yaklaşırken gibi hissetmiyorum. Bu XML yapısında, her thirdLevel düğümü için PDF'de bir metin bloğu çıkarmam gerekiyor. Bugüne kadar sahip XSL Temelde, her thirdLevel düğüm için metin kendi satırında görünmesi için üst öznitelik için bazı değer katmak gerekir

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

gibidir. ID ile ekleme/çoğaltma (1'den başlar ve her bir set için 1'e kadar artar) ve position() kombinasyonlarını kullanmayı denedim, ancak bunu doğru göremiyorum.

+0

"concat ((193 * pozisyon()), 'nk')" çalışması gerekir, nasıl çarpma mı yapıyordun? – annakata

+0

Çalıştığım konu, temel olarak, her biri için üç farklı seviye için kullanabileceğim üç farklı pozisyona sahip olduğum. Ayrıca, verilerin XML'de düzenlenme şekliyle, yalnızca position() işlevinin, metnin zaman zaman diğer metnin üzerine çıkmasına neden olduğu görülür. – bcasp

cevap

2

Sanırım gerçekten <xsl:apply-templates>'u incelemelisiniz, bu da sizi çok yazarak kaydedebilir.

Basitleştirilmiş versiyon:

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

Basitleştirilmiş çıkışı (ad "fo" hariç):

<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

Teşekkürler! Bunu çok fazla düşünmüştüm. Benim için basitleştirdiğiniz için teşekkürler. – bcasp

+0

Şimdi bu hızlıydı. Rica ederim. :-D – Tomalak

İlgili konular