Обновить атрибут в XSL для каждого
-
03-07-2019 - |
Вопрос
На работе мне дали забавную задачу по созданию 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>