2009-03-03 7 views
0

На работе мне прислали интересную задачу создания PDF-файлов с помощью XSL. Структура XML Я работаю с подобенАтрибут обновления в XSL для каждого

<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 появляется на отдельной строке. Я пробовал использовать комбинации добавления/умножения по ID (начинается с 1 и увеличивается на 1 для каждого набора) и position(), но я не могу понять, что это правильно.

+0

"CONCAT ((193 * позиция()), 'пт')" должен работать, как вы делали умножение? – annakata

+0

Проблема, с которой я столкнулся, состоит в том, что у меня в основном есть три разные позиции, которые я мог бы использовать для трех разных уровней для каждого уровня. Кроме того, с учетом того, как данные изложены в 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: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

Смежные вопросы