<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dtb="http://www.daisy.org/z3986/2005/dtbook/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.0" exclude-result-prefixes="dtb">
<xsl:template name="dtb:insert-covered-table-cells" as="element()*">
<xsl:param name="table_cells" as="element()*"/>
<xsl:param name="covered_cells" as="element()*"/>
<xsl:param name="current_row" as="element()*"/>
<xsl:param name="row_count" as="xs:integer" select="0"/>
<xsl:param name="clone_cells" as="xs:boolean" select="false()" tunnel="yes"/>
<xsl:param name="insert_if_colspan" as="xs:boolean" select="true()" tunnel="yes"/>
<xsl:param name="insert_if_rowspan" as="xs:boolean" select="true()" tunnel="yes"/>
<xsl:variable name="cell_count" select="count($current_row)"/>
<xsl:choose>
<xsl:when test="$covered_cells[@row=($row_count+1) and @col=($cell_count+1)]">
<xsl:call-template name="dtb:insert-covered-table-cells">
<xsl:with-param name="table_cells" select="$table_cells"/>
<xsl:with-param name="current_row" select="($current_row, $covered_cells[@row=($row_count+1) and @col=($cell_count+1)])"/>
<xsl:with-param name="row_count" select="$row_count"/>
<xsl:with-param name="covered_cells" select="$covered_cells[not(@row=($row_count+1) and @col=($cell_count+1))]"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$table_cells[1][count(parent::*/preceding-sibling::dtb:tr)=$row_count]">
<xsl:variable name="new_covered_cells" as="element()*">
<xsl:variable name="colspan" as="xs:integer" select="if ($table_cells[1]/@colspan) then $table_cells[1]/@colspan else 1"/>
<xsl:variable name="rowspan" as="xs:integer" select="if ($table_cells[1]/@rowspan) then $table_cells[1]/@rowspan else 1"/>
<xsl:if test="($insert_if_colspan and $colspan > 1) or ($insert_if_rowspan and $rowspan > 1)">
<xsl:sequence select="for $i in 1 to $rowspan return for $j in 1 to $colspan return if (not($i=1 and $j=1)) then dtb:covered-table-cell($row_count + $i, $cell_count + $j, $table_cells[1], $clone_cells) else ()"/>
</xsl:if>
</xsl:variable>
<xsl:call-template name="dtb:insert-covered-table-cells">
<xsl:with-param name="table_cells" select="$table_cells[position() > 1]"/>
<xsl:with-param name="current_row" select="($current_row, $table_cells[1])"/>
<xsl:with-param name="row_count" select="$row_count"/>
<xsl:with-param name="covered_cells" select="($covered_cells, $new_covered_cells)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:if test="exists($current_row)">
<xsl:element name="dtb:tr">
<xsl:sequence select="$current_row"/>
</xsl:element>
<xsl:if test="exists($table_cells)">
<xsl:call-template name="dtb:insert-covered-table-cells">
<xsl:with-param name="table_cells" select="$table_cells"/>
<xsl:with-param name="current_row" select="()"/>
<xsl:with-param name="row_count" select="$row_count + 1"/>
<xsl:with-param name="covered_cells" select="$covered_cells"/>
</xsl:call-template>
</xsl:if>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:function name="dtb:covered-table-cell">
<xsl:param name="row"/>
<xsl:param name="col"/>
<xsl:param name="original_cell"/>
<xsl:param name="clone_cells"/>
<xsl:element namespace="{namespace-uri($original_cell)}" name="{name($original_cell)}">
<xsl:attribute name="row" select="$row"/>
<xsl:attribute name="col" select="$col"/>
<xsl:attribute name="covered-table-cell" select="'yes'"/>
<xsl:sequence select="if ($clone_cells) then $original_cell/node() else ()"/>
</xsl:element>
</xsl:function>
</xsl:stylesheet>