如何在XSL-FO动态表格循环中按XML节点设置fo:block加粗?
正确实现方案
示例XML数据
<Items> <Item> <ItemName>ItemName1</ItemName> <ItemValue>Value1</ItemValue> </Item> <Item> <ItemName>ItemName2</ItemName> <ItemValue>Value2</ItemValue> </Item> <Item> <ItemName>ItemName3</ItemName> <ItemValue>Value3</ItemValue> </Item> <Item> <ItemName>ItemName4</ItemName> <ItemValue>Value4</ItemValue> </Item> </Items>
正确XSL-FO代码
方法1:用<xsl:choose>切换字体样式
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="/"> <fo:root> <fo:layout-master-set> <fo:simple-page-master master-name="page" page-width="8.5in" page-height="11in"> <fo:region-body margin="1in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="page"> <fo:flow flow-name="xsl-region-body"> <fo:table> <fo:table-body> <xsl:for-each select="Items/Item"> <fo:table-row> <!-- ItemName 单元格 --> <fo:table-cell> <xsl:choose> <xsl:when test="ItemName = 'ItemName3' or ItemName = 'ItemName4'"> <fo:block font-weight="bold"> <xsl:value-of select="ItemName"/> </fo:block> </xsl:when> <xsl:otherwise> <fo:block> <xsl:value-of select="ItemName"/> </fo:block> </xsl:otherwise> </xsl:choose> </fo:table-cell> <!-- ItemValue 单元格 --> <fo:table-cell> <xsl:choose> <xsl:when test="ItemName = 'ItemName3' or ItemName = 'ItemName4'"> <fo:block font-weight="bold"> <xsl:value-of select="ItemValue"/> </fo:block> </xsl:when> <xsl:otherwise> <fo:block> <xsl:value-of select="ItemValue"/> </fo:block> </xsl:otherwise> </xsl:choose> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> </xsl:stylesheet>
方法2:动态添加font-weight属性(减少重复代码)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="/"> <fo:root> <fo:layout-master-set> <fo:simple-page-master master-name="page" page-width="8.5in" page-height="11in"> <fo:region-body margin="1in"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="page"> <fo:flow flow-name="xsl-region-body"> <fo:table> <fo:table-body> <xsl:for-each select="Items/Item"> <!-- 定义变量存储是否需要加粗 --> <xsl:variable name="isBold" select="ItemName = 'ItemName3' or ItemName = 'ItemName4'"/> <fo:table-row> <!-- ItemName 单元格 --> <fo:table-cell> <fo:block> <xsl:if test="$isBold"> <xsl:attribute name="font-weight">bold</xsl:attribute> </xsl:if> <xsl:value-of select="ItemName"/> </fo:block> </fo:table-cell> <!-- ItemValue 单元格 --> <fo:table-cell> <fo:block> <xsl:if test="$isBold"> <xsl:attribute name="font-weight">bold</xsl:attribute> </xsl:if> <xsl:value-of select="ItemValue"/> </fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </fo:flow> </fo:page-sequence> </fo:root> </xsl:template> </xsl:stylesheet>
错误原因说明
- 你之前用的
ItemName != 'ItemName3' or ItemName != 'ItemName4'逻辑完全错误:任何ItemName都不可能同时等于ItemName3和ItemName4,所以这个条件永远为真,导致所有文本都走正常字体分支。正确逻辑是当ItemName等于ItemName3或ItemName4时应用加粗。 - 关于
fo:table-cell缺少子元素的报错:必须保证每个fo:table-cell内部至少有一个fo:block元素,哪怕内容为空,不能让cell直接没有子节点。
内容的提问来源于stack exchange,提问作者Rito Sarkar
相关产品推荐
相关产品推荐

