Holge r: XSLT 2.0 function für Spreadsheetspalten

Beitrag lesen

Hallo,

ich habe da ein leidiges Problem, was ich schon immer mal in Angriff nehmen wollte. Ziel soll es sein, ein xsl:function zu erstellen, die eine Nummer in eine Spreadsheet Letter Code umwandelt, Also ganz einfach 1 = A, 5 = E; 27 = AA usw. Zur Zeit regele ich das über eine Templatekombination, die zwar ihre Aufgabe erfüllt, aber mir nicht so richtig gefällt und eher auf die schnelle geschrieben wurde. Eher mag ich xf:translate-column-number($ColumnNumber) einfach aufrufen, als die Template kombination. Nur weiss ich nicht so recht wie ich da am besten herangehe unter xslt2.0.

Abfrage erfolgt über:

<xsl:call-template name="translateColumnNumberToColumnLetter">
 <xsl:with-param name="currentColumn" select="$ColumnNumber"/>
</xsl:call-template>

<xsl:template name="translateColumnNumberToColumnLetter">
        <xsl:param name="currentColumn" select="0"/>
        <xsl:param name="FirstLetter" select="0"/>

xsl:choose
            <xsl:when test="$FirstLetter &lt; 27">
                xsl:choose
                    <xsl:when test="$currentColumn &lt; 27">
                        <xsl:call-template name="getColumnLetter">
                            <xsl:with-param name="FirstLetter" select="$FirstLetter"/>
                            <xsl:with-param name="SecondLetter" select="$currentColumn"/>
                        </xsl:call-template>
                    </xsl:when>
                    xsl:otherwise
                        <xsl:call-template name="translateColumnNumberToColumnLetter">
                            <xsl:with-param name="FirstLetter" select="$FirstLetter + 1"/>
                            <xsl:with-param name="currentColumn" select="$currentColumn - 26"/>
                        </xsl:call-template>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            xsl:otherwise
                <xsl:value-of select="'only Column to XX supported'"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

<xsl:template name="getColumnLetter">
        <xsl:param name="FirstLetter"/>
        <xsl:param name="SecondLetter"/>
        <xsl:call-template name="ColumnLetter">
            <xsl:with-param name="Number" select="$FirstLetter"/>
        </xsl:call-template>
        <xsl:call-template name="ColumnLetter">
            <xsl:with-param name="Number" select="$SecondLetter"/>
        </xsl:call-template>
    </xsl:template>

<xsl:template name="ColumnLetter">
        <xsl:param name="Number"/>
        <xsl:if test="$Number != 0">
            <xsl:if test="$Number = 1">
                xsl:textA</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 2">
                xsl:textB</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 3">
                xsl:textC</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 4">
                xsl:textD</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 5">
                xsl:textE</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 6">
                xsl:textF</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 7">
                xsl:textG</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 8">
                xsl:textH</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 9">
                xsl:textI</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 10">
                xsl:textJ</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 11">
                xsl:textK</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 12">
                xsl:textL</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 13">
                xsl:textM</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 14">
                xsl:textN</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 15">
                xsl:textO</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 16">
                xsl:textP</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 17">
                xsl:textQ</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 18">
                xsl:textR</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 19">
                xsl:textS</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 20">
                xsl:textT</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 21">
                xsl:textU</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 22">
                xsl:textV</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 23">
                xsl:textW</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 24">
                xsl:textX</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 25">
                xsl:textY</xsl:text>
            </xsl:if>
            <xsl:if test="$Number = 26">
                xsl:textZ</xsl:text>
            </xsl:if>
        </xsl:if>
    </xsl:template>