我的最终目标是使用 XSLT 样式表将 HTML 表格转换colspan
为 Dita docbook 格式。table
对于不熟悉 DITA 表的人来说,它使用namest
和nameend
属性来实现colspan
;namest
和nameend
分别是开始和结束列的名称。列名由colspecs
元素指定。
<colspec colname="c1" colnum="1">
我有以下困难:
1)我想colspec
自动生成这些元素。
因为我要处理很多表,所以我没有固定数量的列。我正在使用 XSLT 函数进行计数,如下所示:
<xsl:variable name="colNum" select="count(tbody/tr[td][1]/td[not(@*)]) + sum(tbody/tr[td][1]/td/@colspan)" />
然后我使用以下内容生成$colNum
colspec 元素,colname
并column
从 1 递增到$colNum
.
<xsl:for-each select="1 to $colNum">
<colspec colname="{concat('c', .)}" column="{.}" />
</xsl:for-each>
当我运行这个样式表时,我得到错误抱怨$colNum
不是整数。我尝试$colNum
使用多个 xslt 函数将其转换为整数,例如:ceiling(number($colNum))
,但 xml 进程坚持$colNum
是双精度数!
2) 找到 的起始列的正确位置colspan
。
以这张表为例:
<table>
<tbody>
<tr>
<th colspan="3">
<p>Name</p>
</th>
<th>
<p>Description</p>
</th>
</tr>
<tr>
<td rowspan="6"/>
<td colspan="2">country-name</td>
<td>Country</td>
</tr>
<tr>
<td colspan="2">extended-address</td>
<td colspan="1"><p>Extra field for address information. </p></td>
</tr>
</tbody>
</table>
对于第 3 行,第 2 td,它实际上是第 4 列!我的 xslt 将无法通过仅研究那一行来判断。我在 sudo 代码中做到了这一点
position() of current td + sum(preceding-sibling[colspan])
在这种情况下,这应该给我 3,但我不知道如何解释实际上将 td 1 列向后推的行跨度。
让我知道是否有更好的选择来做到这一点!
我知道这是一个复杂的问题。任何帮助表示赞赏!提前一百万谢谢!