动态创建fo:table-row时XML解析报错:缺少匹配结束标签
解决XML解析错误:
<fo:table-row>必须由匹配的结束标签终止 嘿,这个XML解析报错我太熟了!你碰到的核心问题就是<fo:table-row>标签没有正确完成闭合,XML解析器对标签的完整性要求特别严格,尤其是XSL-FO里的table-row元素,它需要包含子元素(比如table-cell),绝对不能用自闭合写法,也不能出现开始标签和结束标签不配对的情况。
我给你梳理几个最常见的问题点和对应的解决办法:
1. 不要用自闭合的<fo:table-row/>
FO规范里,table-row是容器元素,必须包裹table-cell,不能是空的自闭合标签。很多新手容易犯这个错:
❌ 错误写法:
<fo:table-row/> <!-- 解析器直接报错,因为没有结束标签,且为空 -->
✅ 正确写法:
<fo:table-row> <fo:table-cell> <fo:block>这里放单元格内容</fo:block> </fo:table-cell> </fo:table-row>
2. 避免条件判断导致的标签不匹配
如果是通过<xsl:if>或<xsl:choose>动态生成行,一定要把整个<fo:table-row>的开始和结束标签放在同一个条件块里,不能拆分:
❌ 错误示例:
<xsl:if test="need-row"> <fo:table-row> <!-- 开始标签在if里 --> </xsl:if> <fo:table-cell>...</fo:table-cell> </fo:table-row> <!-- 结束标签在if外,导致不匹配 -->
✅ 正确做法:
<xsl:if test="need-row"> <fo:table-row> <fo:table-cell> <fo:block>符合条件才生成整行</fo:block> </fo:table-cell> </fo:table-row> </xsl:if>
3. 检查循环生成行的逻辑
如果用<xsl:for-each>循环生成多行,要确保循环内部完整包裹每一行的开始和结束标签:
<fo:table-body> <xsl:for-each select="your-data-node"> <fo:table-row> <fo:table-cell> <fo:block><xsl:value-of select="data-field"/></fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body>
另外,看你贴的代码片段里column-width=...好像没写完,记得<fo:table-column>也要正确闭合(比如column-width="55%"/>),不过这不是当前报错的原因,但也得注意。
如果还是解决不了,建议把完整的table相关XSLT代码贴出来,我可以帮你再排查细节~
内容的提问来源于stack exchange,提问作者chris85
相关产品推荐
相关产品推荐

