Вы можете определить переменную для получения фактической позиции td
с учетом colspans, например,
<xsl:variable name="colpos"
select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + 1" />
Или, когда вы используете XSLT 2.0, вы можете написать выражение так...
<xsl:variable name="colpos"
select="sum(for $td in preceding-sibling::td return (if ($td/@colspan) then $td/@colspan else 1)) + 1" />
Или вот это ...
<xsl:variable name="colpos"
select="sum(preceding-sibling::td/(if (@colspan) then number(@colspan) else 1)) + 1" />
Итак, суммируйте colspans там, где они существуют, и сосчитайте те, без которых (которые имеют colspan 1).
Затем вам нужно получить количество столбцов в colgroup для суммирования, например так:
<xsl:variable name="colspan"
select="if (@colspan) then number(@colspan) else 1" />
Затем, чтобы получить ширину td
, вы можете сделать это
<xsl:value-of
select="concat('width:',
sum(ancestor::table/colgroup/col[position() ge $colpos and position() lt $colpos + $colspan]/number(replace(@width, '%', ''))),
'%;')"/>
Попробуйте этот шаблон
<xsl:template match="td">
<xsl:copy>
<xsl:attribute name="style">
<xsl:if test="@fill">
<xsl:value-of select="concat('background-color: ','#',@fill, ';')"/>
</xsl:if>
<xsl:if test="@align">
<xsl:value-of select="concat('text-align:',@align,';')"/>
</xsl:if>
<xsl:variable name="colpos" select="sum(preceding-sibling::td/@colspan) + count(preceding-sibling::td[not(@colspan)]) + 1" />
<xsl:variable name="colspan" select="if (@colspan) then number(@colspan) else 1" />
<xsl:value-of select="concat('width:', sum(ancestor::table/colgroup/col[position() ge $colpos and position() lt $colpos + $colspan]/number(replace(@width, '%', ''))), '%;')"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>