1

我的最终目标是使用 XSLT 样式表将 HTML 表格转换colspan为 Dita docbook 格式。table

对于不熟悉 DITA 表的人来说,它使用namestnameend属性来实现colspannamestnameend分别是开始和结束列的名称。列名由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)" />

然后我使用以下内容生成$colNumcolspec 元素,colnamecolumn从 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 列向后推的行跨度。

让我知道是否有更好的选择来做到这一点!

我知道这是一个复杂的问题。任何帮助表示赞赏!提前一百万谢谢!

4

0 回答 0