背景

背景

背景

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

这有点脆。

相关内容