使用conflr上传含Flextable的R Markdown到Confluence出现XML编码错误
问题根因
报错是Flextable默认开启ft.shadow参数时,生成的Shadow DOM相关HTML存在<p>标签嵌套<table>的不规范结构,conflr内置的XML严格校验机制识别到标签不匹配就会终止上传。关闭ft.shadow后Shadow DOM被移除,嵌套问题消失,但所有自定义样式(包括单元格着色)也会随Shadow DOM一同被移除——Flextable默认会把自定义样式都挂载在Shadow DOM节点下。
解决方案
方案1:内联样式替代Shadow DOM(适合少量表格场景)
无需关闭全局ft.shadow,将单个Flextable的样式全部内联到元素属性中,即可同时解决标签报错和样式丢失问题:
- 生成Flextable后调用
as_html()方法,指定关闭Shadow DOM、开启CSS内联,再用htmltools::HTML()包裹输出即可,示例代码:
library(flextable) library(htmltools) # 自定义表格逻辑,包含单元格着色设置 ft <- flextable(你的数据表) %>% bg(i = ~分值 < 60, j = "分值", bg = "red") # 示例单元格着色规则 # 输出无Shadow DOM、样式全内联的HTML HTML(as_html(ft, shadow = FALSE, css_unescape = TRUE))
- 该方案生成的表格所有样式都直接写在
<td>、<tr>标签的style属性中,不存在嵌套标签问题,conflr可正常解析,单元格着色效果完全保留。
方案2:全局钩子修复标签结构(适合多表格场景)
如果文档内有大量Flextable需要处理,可通过全局knitr钩子统一修复标签嵌套问题,无需修改单个表格的生成逻辑:
- 在R Markdown文档的setup初始化代码块中加入以下代码:
knitr::knit_hooks$set(html = function(x, options) { # 匹配Flextable输出,移除包裹表格的多余<p>标签 if (grepl('class="flextable"', x)) { x <- gsub("^<p>(.*?)</p>$", "\\1", x) } return(x) })
- 保留
ft.shadow默认开启状态即可,Shadow DOM承载的样式不会丢失,同时钩子会自动移除导致报错的多余<p>嵌套结构,conflr解析不会再触发标签不匹配报错。
内容的提问来源于stack exchange,提问作者Sapsi
相关产品推荐
相关产品推荐

