You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:30:45