Pergunta

No trabalho que me foi dada a tarefa divertida de gerar PDFs com XSL. A estrutura XML Eu estou trabalhando com é semelhante ao

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

Gostaria de tentar dar um exemplo mais significativo do XML, mas eu não me sinto como se aproximar de quaisquer limites legais que possam existir. Com essa estrutura XML, tenho de saída de um bloco de texto no PDF para cada nó thirdLevel. O XSL eu tenho até agora é como

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

Basicamente, eu preciso adicionar algum valor para o atributo de cima para tornar o texto para cada nó thirdLevel aparecer em sua própria linha. Eu tentei usar combinações de adição / multiplicando pelo ID (começa em 1 e aumenta em 1 para cada conjunto) e position(), mas eu não consigo fazê-lo direito.

Foi útil?

Solução

Eu acho que você deve realmente olhar para <xsl:apply-templates>, ele pode te salvar um monte de digitação.

Versão simplificada:

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

saída simplificado ( "fo" namespace excluídos):

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top