我的最终目标是使用XSLT样式表将带有colspan
的HTML表格转换为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
不是整数。我尝试将带有多个xslt函数的$colNum
转换为整数,例如: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行,它实际上是第4列!我的xslt将无法通过研究那一行来判断。我在sudo代码中得到了这个
position() of current td + sum(preceding-sibling[colspan])
在这种情况下,这应该给我3,但我不知道如何解释实际上推回td 1列的rowspan。
让我知道是否有更好的选择来做到这一点!
我知道这是一个复杂的问题。任何帮助表示赞赏!提前感谢一百万!