如何在没有 xsl:for-each 的情况下在 XSL:FO 中动态生成行颜色
How to dynamically generate row color in XSL:FO without xsl:for-each
我有一个数据集,其中包含不同的属性列表(大约 15 个),如下所示。
示例数据 1:
<cd>
<name>Tom</name>
<address>Madison Square</address>
<phone>000-000-0000</phone>
</cd>
示例数据 2:
<cd>
<name>Tom</name>
<city>New York</city>
<phone>000-000-0000</phone>
</cd>
完整的属性列表(子集):
<cd>
<name>xxx</name>
<address>xxxx</address>
<city>xxxx</city>
<phone>000-000-0000</phone>
</cd>
我想为此动态 table 构建一个具有备用行颜色的 fo:table。我试过使用 xsl:for-each 和 position(),但它不起作用。有没有办法获取前一行的属性,比如颜色?任何建议。
添加代码供参考:
<fo:table-row>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block> <xsl:value-of select="cd/name"/></fo:block>
</fo:table-cell>
</fo:table-row>
<xsl:if test="normalize-space(cd/address) !=''">
<fo:table-row background-color="#EEF0F2" >
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block> <xsl:value-of select="cd/address"/></fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:if>
<xsl:if test="normalize-space(cd/city) !=''">
<fo:table-row background-color="#EEF0F2" >
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block> <xsl:value-of select="cd/city"/></fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:if>
Post 你的代码。在这种情况下,一种策略是首先在变量中构建 table,然后将其复制到输出,同时添加颜色标签。这可能不那么混乱。
您发布的代码示例还不够。我们不知道上下文。可复制的东西(我们可以运行)是理想的。
这是一个通用的答案,应该有所帮助。
您可以做的是使用 xsl:apply-templates
处理 cd
的非空子项。这会更改正在处理的节点集,并允许 position()
正常工作。
注意:您也可以使用 xsl:for-each
执行此操作。但是,如果您要将最简单的 XML 之外的任何内容转换为非常简单的 XSL-FO,您最好使用推送方法而不是拉取方法。这将使您的 XSLT 更易于维护和扩展。
然后您可以使用mod
查看该位置是否可以被 2 整除。如果可以,请添加背景颜色。
示例:
XML 输入
<cd>
<name>xxx</name>
<address>xxxx</address>
<city>xxx</city>
<whatevs></whatevs>
<phone>000-000-0000</phone>
</cd>
XSLT 1.0
<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 indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:table>
<fo:table-body>
<xsl:apply-templates select="cd/*[string()]"/>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="cd/*">
<fo:table-row>
<xsl:if test="position() mod 2">
<xsl:attribute name="background-color">
<xsl:text>#EEF0F2</xsl:text>
</xsl:attribute>
</xsl:if>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block><xsl:value-of select="."/></fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
</xsl:stylesheet>
XSL-FO 输出
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:table>
<fo:table-body>
<fo:table-row background-color="#EEF0F2">
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>xxx</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>xxxx</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row background-color="#EEF0F2">
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>xxx</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>000-000-0000</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
渲染的 PDF(使用 FOP 1.1)
我有一个数据集,其中包含不同的属性列表(大约 15 个),如下所示。
示例数据 1:
<cd>
<name>Tom</name>
<address>Madison Square</address>
<phone>000-000-0000</phone>
</cd>
示例数据 2:
<cd>
<name>Tom</name>
<city>New York</city>
<phone>000-000-0000</phone>
</cd>
完整的属性列表(子集):
<cd>
<name>xxx</name>
<address>xxxx</address>
<city>xxxx</city>
<phone>000-000-0000</phone>
</cd>
我想为此动态 table 构建一个具有备用行颜色的 fo:table。我试过使用 xsl:for-each 和 position(),但它不起作用。有没有办法获取前一行的属性,比如颜色?任何建议。
添加代码供参考:
<fo:table-row>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block> <xsl:value-of select="cd/name"/></fo:block>
</fo:table-cell>
</fo:table-row>
<xsl:if test="normalize-space(cd/address) !=''">
<fo:table-row background-color="#EEF0F2" >
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block> <xsl:value-of select="cd/address"/></fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:if>
<xsl:if test="normalize-space(cd/city) !=''">
<fo:table-row background-color="#EEF0F2" >
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block> <xsl:value-of select="cd/city"/></fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:if>
Post 你的代码。在这种情况下,一种策略是首先在变量中构建 table,然后将其复制到输出,同时添加颜色标签。这可能不那么混乱。
您发布的代码示例还不够。我们不知道上下文。可复制的东西(我们可以运行)是理想的。
这是一个通用的答案,应该有所帮助。
您可以做的是使用 xsl:apply-templates
处理 cd
的非空子项。这会更改正在处理的节点集,并允许 position()
正常工作。
注意:您也可以使用 xsl:for-each
执行此操作。但是,如果您要将最简单的 XML 之外的任何内容转换为非常简单的 XSL-FO,您最好使用推送方法而不是拉取方法。这将使您的 XSLT 更易于维护和扩展。
然后您可以使用mod
查看该位置是否可以被 2 整除。如果可以,请添加背景颜色。
示例:
XML 输入
<cd>
<name>xxx</name>
<address>xxxx</address>
<city>xxx</city>
<whatevs></whatevs>
<phone>000-000-0000</phone>
</cd>
XSLT 1.0
<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 indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:table>
<fo:table-body>
<xsl:apply-templates select="cd/*[string()]"/>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
</xsl:template>
<xsl:template match="cd/*">
<fo:table-row>
<xsl:if test="position() mod 2">
<xsl:attribute name="background-color">
<xsl:text>#EEF0F2</xsl:text>
</xsl:attribute>
</xsl:if>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block><xsl:value-of select="."/></fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:template>
</xsl:stylesheet>
XSL-FO 输出
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="my-page" page-width="8.5in" page-height="11in">
<fo:region-body margin="1in" margin-top="1.5in" margin-bottom="1.5in"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="my-page">
<fo:flow flow-name="xsl-region-body">
<fo:table>
<fo:table-body>
<fo:table-row background-color="#EEF0F2">
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>xxx</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>xxxx</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row background-color="#EEF0F2">
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>xxx</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell padding-left="3pt" padding-top="8pt">
<fo:block>000-000-0000</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:flow>
</fo:page-sequence>
</fo:root>
渲染的 PDF(使用 FOP 1.1)