我有一个HTML表格,根据其内容而有所不同。 1-3列隐藏。 1列名称更改。一切都取决于内容。
我正在创建此HTML表格的PDF版本。 PDF版本使用apache-FOP
和fop v1.0
。 PDF输出在一页上包含2个上述表格。我不想为每种可能性组合创建.xsl
。这是很多重复和维护。
我可以通过将列名称与XML内容一起传递来解决列名更改问题。但是,列的条件可见性似乎是一项更具挑战性的任务。
如何设置条件可见性?有可能吗?
<小时/> 我很难让
<fo:table-column visibility="collapse" />
工作。数据仍显示为可见性设置为隐藏或折叠。 display="none"
看起来很有希望。但是,表格列为API doesn't show it as a valid property。
如果我无法有条件地隐藏列,那么我需要生成18个唯一的xsl
文件...
<小时/> 目前,我的表非常基础。我做
<fo:block font-size="10pt">
<fo:table table-layout="fixed" width="100%" border-collapse="separate">
<fo:table-column />
<fo:table-column />
<fo:table-column />
<fo:table-column />
<fo:table-column />
<fo:table-column visibility="collapse" />
<fo:table-column />
<fo:table-column />
<fo:table-column />
<fo:table-column />
<fo:table-header>
<fo:table-cell border-width="0.2mm" border-style="solid">
<fo:block>Header 1</fo:block>
</fo:table-cell>
//...9 other headers (these should show/hide as needed)
</fo:table-header>
<fo:table-body>
<xsl:for-each select="Object/type/SomeItem/ProcedureItemCollection">
<fo:table-row>
<fo:table-cell border-width="0.2mm" border-style="solid" >
<fo:block>
<xsl:value-of select="content1"/>
</fo:block>
</fo:table-cell>
//...9 other cells...
</fo:table-row>
</xsl:for-each>
</fo:table-body>
</fo:table>
</fo:block>
XML
<Procedure>
<SiteName>Site1</SiteName>//If Site1, don't create column 2
//If Site2, don't create column 2,3,4
//If Site3, create all columns
<itemtype1>
<item><member1></member1><member2></member2></item>
<item><member1></member1><member2></member2></item>
</itemtype1>
<itemtype2>
<item><member1></member1><member2></member2></item>
<item><member1></member1><member2></member2></item>
</itemtype2>
</Procedure>
这样做,我在创建表时几乎没有灵活性。但是,这就是我所知道的。
答案 0 :(得分:4)
经过大量的修补后,我发现我可以使用xsl:when
和变量添加/删除列。
首先创建一个变量
<xsl:variable name="SiteName" select="Procedure/SiteName" />
然后有条件地创建表的3个元素(列定义,标题,正文)。从列定义开始......
<xsl:choose>
<xsl:when test="$SiteName = 'Site1'">
<fo:table-column />//column 2
</xsl:when>
</xsl:choose>
然后标题
<xsl:choose>
<xsl:when test="$SiteName = 'Site1'">
<fo:table-cell border-width="0.2mm" border-style="solid">
<fo:block>Column2</fo:block>
</fo:table-cell>
</xsl:when>
</xsl:choose>
最后,身体
<xsl:choose>
<xsl:when test="$SiteName = 'Site1'">
<fo:table-cell border-width="0.2mm" border-style="solid" >
<fo:block>
<xsl:value-of select="column2value"/>
</fo:block>
</fo:table-cell>
</xsl:when>
</xsl:choose>