Für ein bestimmtes Ausgabeformat (nicht HTML-like), muss ich HTML-Tabellen ‚Quadrat‘ Tabellen konvertieren, wobei jede colspan
und rowspan
ist nicht nur in der angegebenen Elternzelle, aber auch von der richtigen Anzahl leerer Zellen gefolgt.Convert HTML colspan und rowspan zu „leeren“ Zellen
Zum Beispiel die einfache HTML-Tabelle
<table>
<tr>
<th>test</th>
<th colspan="2">span 1/2</th>
<th colspan="3">span 2/2</th>
</tr>
<tr>
<td>col 1</td>
<td>col 2</td>
<td>col 3</td>
<td>col 4</td>
<td>col 5</td>
<td>col 6</td>
</tr>
</table>
sollte
<table>
<tr>
<th>test</th>
<th colspan="2">span 1/2</th>
<th /> <!-- < empty cell added -->
<th colspan="3">span 2/2</th>
<th /> <!-- < empty cell added -->
</tr>
..
übersetzt werden (Anmerkung: das Ausgabeformat verwendet eine ganz andere Syntax, dies aus Gründen der Übersichtlichkeit ist nur!)
und in ähnlicher Weise sollten Zeilenspans zum nächsten <tr>
Zeilen weitergeleitet werden:
<table><tr><td rowspan="3" /><td rowspan="2" /><td /></tr>
<tr><td>data</td></tr>
<tr><td>data</td><td>data</td></tr>
</table>
was kommen sollte als
<table>
<tr><td /><td /><td /></tr>
<tr><td /><td /><td>data</td></tr> <!-- 2 empty cells added -->
<tr><td /><td>data</td><td>data</td></tr> <!-- 1 empty cell added -->
<table>
colspan
Handhabung ist einfach:
<xsl:template name="add-empty">
<xsl:param name="repeat" />
<xsl:if test="$repeat > 1">
<td class="empty" />
<xsl:call-template name="add-empty">
<xsl:with-param name="repeat" select="$repeat - 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="th|td">
<td>
<xsl:apply-templates />
</td>
<xsl:if test="@colspan">
<xsl:call-template name="add-empty">
<xsl:with-param name="repeat" select="@colspan" />
</xsl:call-template>
</xsl:if>
</xsl:template>
Dies wird einzelne hinzufügen th
oder td
, überprüfen jedes der colspan
, und so viele leere Zellen einfügen je nach Bedarf mit ein rekursiver Aufruf der Vorlage add-empty
. Das Klassenattribut empty
dient nur zum Debuggen.
Das Problem ist in der rowspan
s. Damit dies ordnungsgemäß funktioniert, müssen Sie über alle vorherige tr
scannen und eine Zählung der Spalten beibehalten, die leer sein müssen. Die Iteration wäre so etwas wie
<xsl:if test="position() > 1">
<xsl:variable name="currentRow" select="position()" />
<xsl:for-each select="../tr[position() < $currentRow]">
<xsl:message>testing <xsl:value-of select="." /></xsl:message>
</xsl:for-each>
</xsl:if>
sein - es ist nicht in der ersten Reihe, da für, dass nur colspan
Bedürfnis Hinzufügen genannt werden muss. Die Frage ist also zweifach: Wie würde ich die Zellensatzliste erstellen, um einen korrekten Satz für die aktuelle Zeile zu ergeben? Und mit so einer Liste, wie kann ich über beide diese Liste (die so lange wie die Gesamtzahl der Spalten in der Tabelle ist) und jeder Zeile th|td
Elemente?
Letzteres ist ein Problem, weil ich über beiden die Zelle etwas mit wie
<xsl:for-each select="1 to string-length(cell-set)">
<xsl:if test="substring($cell-set, ., 1) = 'E'>
.. empty ..
...
</xsl:for-each>
gesetzt laufen kann (wenn cell-set
ist ein String), oder über den ‚aktuellen‘ tr
Inhalt
<xsl:for-each select="th|td">
..
In diesem Fall gibt es keine direkte Beziehung zum Inhalt von cell-set
. Mit dem ersten weiß ich nicht, welchen Index td|th
einzufügen ist, mit dem zweiten weiß ich nicht, wann ein Leerzeichen einzufügen ist.
Wie Sie zu haben scheinen schaltet 2,0 bis XSLT möchten Sie vielleicht http://andrewjwelch.com/code/xslt/ überprüfen table/table-normalization.html als idee kopiert es die vorhandene zelle, anstatt eine leere hinzuzufügen, aber anders als der algorithmus sollte es tun, wenn ich mich nicht mit ihren anforderungen täusche. –
@MartinHonnen: Ich habe nicht so viel "umgestellt", als etwas spät, merkte ich, dass ich besser angeben soll :) - die Aufgabe scheint entmutigend genug, sogar * mit * 2.0 Funktionen. Schaut nach dem Link und Ihrer Antwort a.s.a.p. (Ah - zum Beispiel, for-jedes select = "1 bis @colspan" 'statt meiner eigenen rekursiven Vorlage in 1.0 ... ordentlich!) – usr2564301
@RadLexus Sehen Sie, ob dies hilft: http://StackOverflow.com/a/27217608/3016153 –