背景
tfoot
如果元素尚不存在,则为最后一行设置 XHTML 表页脚样式。
代码
鉴于:
\startbuffer[document]
<table>
<thead>
<tr><th>Item</th><th>Power</th><th>Usage</th><th>Cost</th></tr>
</thead>
<tbody>
<tr><td>Geothermal</td><td>1250</td><td>Electricity</td><td>5.1</td></tr>
<tr><td>Fire Station</td><td>-9.6</td><td>Protection</td><td>0.5</td></tr>
<tr><td>Roads</td><td>0</td><td>Transport</td><td>0.9</td></tr>
<tr><td>Totals</td><td>129.9</td><td>n/a</td><td>19.4</td></tr>
</tbody></table>
\stopbuffer
\xmlregistersetup{xml:xhtml}
\startxmlsetups xml:xhtml
\xmlsetsetup{\xmldocument}{*}{-}
\xmlsetsetup{\xmldocument}{table|thead|tbody|tfoot|tr|th|td|caption}{xml:*}
\stopxmlsetups
\startxmlsetups xml:table
\startembeddedxtable\xmlflush{#1}\stopembeddedxtable
\stopxmlsetups
\startxmlsetups xml:thead
\startxtablebody[head]\xmlflush{#1}\stopxtablebody
\stopxmlsetups
\startxmlsetups xml:tbody
\startxtablebody[body]\xmlflush{#1}\stopxtablebody
\stopxmlsetups
\startxmlsetups xml:tfoot
\startxtablebody[foot]\xmlflush{#1}\stopxtablebody
\stopxmlsetups
\startxmlsetups xml:tr
\startxrow\xmlflush{#1}\stopxrow
\stopxmlsetups
\startxmlsetups xml:th
\startxcell\bold{\xmlflush{#1}}\stopxcell
\stopxmlsetups
\startxmlsetups xml:td
\startxcell\xmlflush{#1}\stopxcell
\stopxmlsetups
\setupxtable[
frame=off,
topframe=on,
bottomframe=on,
option={stretch,width},
split=yes,
header=repeat,
footer=repeat,
]
\setupxtable[head][rulethickness=1pt]
\setupxtable[body][]
\setupxtable[foot][rulethickness=1pt]
\starttext\xmlprocessbuffer{}{document}{}\stoptext
生成:
问题
无法识别页脚行,这意味着无法应用以下样式:
\setupxtable[foot][rulethickness=1pt]
在某些情况下,XHTML 表包含tfoot
元素;在其他情况下,XHTML 表没有tfoot
。在这两种情况下,都必须应用页脚 xtable 设置(即设置 的规则粗细[foot]
)。
尝试
以下操作几乎可行,但最后一行未添加到表中:
\xmlsetsetup{\xmldocument}{tr[position()<last()]}{xml:tr}
\xmlsetsetup{\xmldocument}{tr[position()=last() and ../name()='tbody']}{xml:tr:foot}
\xmlsetsetup{\xmldocument}{tr[position()=last() and ../name()='tfoot']}{xml:tr}
% ... other setups ...
\startxmlsetups xml:tr:foot
\startxtablebody[foot]\startxrow\xmlflush{#1}\stopxrow\stopxtablebody
\stopxmlsetups
问题
当表格不包含元素时,如何设置表格最后一行的样式,tfoot
以便当tfoot
元素是展示?
为了澄清起见,在 XSL 中逻辑类似于:
<!-- Not last row -or- is the last row but not in the footer -->
<xsl:template match="tr[not(last())] or (tr[last()] and ../tfoot)">
\startxrow\xmlflush{#1}\stopxrow
</xsl:if>
<!-- Last row and not in the footer -->
<xsl:template match="tr[last()] and not(../tfoot)">
\startxtablebody[foot]
\startxrow\xmlflush{#1}\stopxrow
\stopxtablebody
</xsl:template>
<!-- Always apply the footer when it exists -->
<xsl:template match="tfoot">
\startxtablebody[foot]\xmlflush{#1}\stopxtablebody
</xsl:template>
ConTeXt 版本:2021.03.31 18:04
答案1
- 从设置中移除封闭体
xml:tbody
。 tr
介绍非最后和最后的具体定义。xml:tbody
最后关闭内tr
。
在代码中:
\startxmlsetups xml:xhtml
\xmlsetsetup{\xmldocument}{*}{-}
\xmlsetsetup{\xmldocument}{table|thead|tbody|tfoot|th|td|caption}{xml:*}
\xmlsetsetup{\xmldocument}{tr[position()!=last()]}{xml:tr}
\xmlsetsetup{\xmldocument}{tr[position()=last()]}{xml:tr:last}
\stopxmlsetups
\startxmlsetups xml:tbody
\startxtablebody[body]
\xmlflush{#1}
\stopxmlsetups
\startxmlsetups xml:tr:last
\stopxtablebody
\startxtablebody[foot]
\startxrow\xmlflush{#1}\stopxrow
\stopxtablebody
\stopxmlsetups
这有点脆。