This solution s quite complicated, and I ve got a nagging feeling there might be a better way of doing it, but it seems to work:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="TABLE">
<tbody>
<xsl:apply-templates select="ROW[1]" />
</tbody>
</xsl:template>
<xsl:template match="ROW">
<xsl:param name="occupiedcols" />
<row>
<xsl:apply-templates select="CELL[1]">
<xsl:with-param name="occupiedcols" select="$occupiedcols" />
</xsl:apply-templates>
</row>
<xsl:apply-templates select="following-sibling::ROW[1]">
<xsl:with-param name="occupiedcols">
<xsl:apply-templates select="CELL[1]" mode="getoccupied">
<xsl:with-param name="occupiedcols" select="$occupiedcols" />
</xsl:apply-templates>
<xsl:text></xsl:text>
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="CELL">
<xsl:param name="occupiedcols" />
<xsl:param name="col" select="1" />
<xsl:variable name="thiscol" select="$col + string-length(substring-before(substring($occupiedcols,$col,255), 0 ))" />
<xsl:element name="entry">
<xsl:attribute name="colname">
<xsl:value-of select="$thiscol" />
</xsl:attribute>
</xsl:element>
<xsl:apply-templates select="following-sibling::CELL[1]">
<xsl:with-param name="occupiedcols" select="$occupiedcols"/>
<xsl:with-param name="col" select="$thiscol + 1" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="CELL" mode="getoccupied">
<xsl:param name="occupiedcols" />
<xsl:param name="col" select="1" />
<xsl:variable name="thiscol" select="$col + string-length(substring-before(substring($occupiedcols,$col,255), 0 ))" />
<xsl:choose>
<xsl:when test="contains(substring($occupiedcols,$col,255), 0 )">
<xsl:value-of select="translate(substring-before(substring($occupiedcols,$col,255), 0 ), 0123456789 , -012345678 )" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="translate(substring($occupiedcols,$col,255), 123456789 , 012345678 )" />
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="@ROWSPAN - 1" />
<xsl:if test="not(following-sibling::CELL)">
<xsl:value-of select="translate(substring($occupiedcols,$thiscol + 1, 255), 0123456789 , 0012345678 )" />
</xsl:if>
<xsl:apply-templates select="following-sibling::CELL[1]" mode="getoccupied">
<xsl:with-param name="occupiedcols" select="$occupiedcols"/>
<xsl:with-param name="col" select="$thiscol + 1" />
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
有一个已知的问题:如果一个囚室横跨9个以上的牢房,它将打破。 如果这是一个问题,它实际上很容易适应。
Also, it doesn t support any use of COLSPAN
.
它通过一系列数字,详细说明每个栏中仍然有囚室的行数,因此,第二行将以你为例通过21020,并根据0分点计算<条码><>。 两行的第二次通行证将数位数减少一,但每间单位的位数为0位。
这一解决办法还假设,所有单元都有一个“条形”栏目,即使它们只覆盖一个字。 如果情况不如此,我可以补充一种手段,支持“条形表”的缺省。