Как сделать зебра в xslt
Я пытаюсь сделать полоску зебры для моего файла PDF. XML, как показано ниже:
<root>
<order>
<attribute1>1</attribute1>
<attribute2>2</attribute2>
<attribute3>0</attribute3>
<attribute4>4</attribute4>
<attribute5/>
</order>
</root>
Атрибут3 не появляется, если значение равно 0. Атрибут5 также не отображается, если для него нет значения. Поэтому я не могу сделать полоску зебры, как показано ниже:
<fo:table-row (colored)>
<fo:table-cell>
<fo:block>
<xsl:text>Attribute1</xsl:text>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:text>...</xsl:text>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row (non colored)>
<fo:table-cell>
<fo:block>
<xsl:text>Attribute2</xsl:text>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:text>...</xsl:text>
</fo:block>
</fo:table-cell>
</fo:table-row>
Потому что attribute3 и attribute5 не всегда появляются в pdf-файле. Как мне это сделать?
1 ответ
Здесь нужно сначала использовать xsl:apply-templates, чтобы выбрать только дочерние узлы, которые вы хотите вывести (предполагается, что вы в данный момент расположены на элементе order:
<xsl:apply-templates select="*[normalize-space()][. != '0']" />
Затем у вас есть шаблон для соответствия дочерним элементам элементов порядка, например:
В этом шаблоне вы можете затем вывести строку таблицы, а для выполнения атрибута 'color' вы можете проверить 'позицию' текущего атрибута, чтобы увидеть, является ли он нечетным или четным:
<fo:table-row>
<xsl:if test="position() mod 2 = 0">
<xsl:attribute name="colour">zebra</xsl:attribute>
</xsl:if>
Попробуйте это XSLT как начало
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="order">
<fo:table>
<xsl:apply-templates select="*[normalize-space()][. != '0']" />
</fo:table>
</xsl:template>
<xsl:template match="order/*">
<fo:table-row>
<xsl:if test="position() mod 2 = 0">
<xsl:attribute name="colour">zebra</xsl:attribute>
</xsl:if>
<fo:table-cell>
<fo:block>
<xsl:value-of select="local-name()" />
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>
<xsl:text>...</xsl:text>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
</xsl:stylesheet>
Очевидно, вы бы использовали правильный стиль xsl-fo здесь, а не буквально атрибут "color=zebra", как показано здесь....