سؤال

وفي العمل لقد أعطيت مهمة ممتعة لتوليد ملفات PDF مع XSL. هيكل XML أعمل مع مشابه ل

<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، لكنني لا أشعر بأن يقترب أي الحدود القانونية التي قد تكون موجودة. مع أن هيكل XML، لا بد لي من إخراج كتلة من النص في PDF لكل عقدة thirdLevel. وXSL لدي حتى الآن مثل

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

وفي الأساس، ولست بحاجة إلى إضافة بعض القيمة إلى السمة أعلى لجعل النص لكل عقدة thirdLevel تظهر على السطر الخاص به. لقد حاولت باستخدام تركيبات إضافة / ضرب من قبل معرف (يبدأ في 1 و زيادات بمقدار 1 لكل مجموعة) وposition()، ولكن أنا لا يمكن أن يبدو للحصول على ذلك الحق.

هل كانت مفيدة؟

المحلول

وأعتقد أن عليك أن تنظر حقا إلى <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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top