Вопрос

На работе мне дали забавную задачу по созданию 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