Hallo,
die im vorigen Post angesprochenen "repeated"-Felder am Ende einer Zeile stellen teilweise ein Problem dar, weil diese eine "Laufzeitfehler" verursachen: Zu viele Rekursionen.
Habe daraufhin ein paar kleine Änderungen vorgenommen:
xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="no"/>
<xsl:variable name="MaxRecursion" select="20"/>
[...]
<!-- 2.1. Schritt -->
<xsl:template name="CleanUpRow">
[...]
<xsl:choose>
<xsl:when test="@table:number-columns-repeated and (@table:number-columns-repeated < $MaxRecursion)">
<xsl:value-of select="@table:number-columns-repeated"/>
</xsl:when>
[...]
</xsl:template>
<!-- 2.1.1. Schritt - Schreibe Cell -->
<xsl:template name="CreateCell">
<xsl:param name="Repeat"/>
<xsl:if test="$Repeat > 0">
<table:table-cell>
[...]
</table:table-cell>
<!-- ueberpruefe ob columns spanned besteht -->
<xsl:if test="@table:number-columns-spanned and (@table:number-columns-spanned < $MaxRecursion)">
<!-- erstelle leere table-cell elemente -->
[...]
</xsl:if>
[...]
</xsl:if>
</xsl:template>
Das hat den angenehmen Nebeneffekt, dass die Transformation wesentlich schneller läuft :) Darüber hinaus kann davon ausgegangen werden, dass unter normalen Umständen innerhalb der ersten 30 Spalten eines ExcelSheets keine 20 Leerzeilen vorkommen - wenn doch, dann kann die ganze Zeile gleich ignoiert werden, weil leer.
Wie gesagt, gäbe es eine elegante Möglichkeit, diese Zellen am Ende einer Zeile zu eleminieren, wäre das schon eine schöne Sache.
Gruß,
Joerg