我有一个具有不同属性列表的数据集(大约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>
我想为这个动态表构建一个具有备用行颜色的fo:表。我尝试过使用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>
答案 0 :(得分:1)
您发布的代码示例还不够。我们不了解背景。可重复的东西(我们可以运行的东西)是理想的。
这是一个应该有所帮助的通用答案。
您可以使用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)
答案 1 :(得分:0)
发布您的代码。在这种情况下,一种策略是首先在变量中构建表,然后将其复制到输出,同时添加颜色标记。这可能不那么混乱了。