Thomas J.S.: 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.

Hier eine andere Lösung:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:sdml="http://www.selfhtml.org" exclude-result-prefixes="sdml">
 <xsl:variable name="spalten">
  <xsl:for-each select="1 to 78">
   <spalte id="{position()}" />
  </xsl:for-each>
 </xsl:variable>
 <xsl:function name="sdml:createColumLetter">
  <xsl:param name="l" />
  <xsl:param name="c" />
  <xsl:param name="n" />
  <xsl:variable name="letters" select="tokenize('A B C D E F G H I J K L M N O P Q R S T U V W X Y Z', ' ')" />
  <xsl:sequence select="if(($n div 26) &lt;= 1) then concat($l, $letters[position() = $n]) else sdml:createColumLetter(concat($l, $letters[position() = $c]), ($c + 1), ($n - 26))"></xsl:sequence>
 </xsl:function>
 <xsl:template match="/">
  <xsl:for-each select="$spalten/spalte">
   <spalte name="{@id}" id="{sdml:createColumLetter('', 1, @id)}" />
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

das XSL an sich angewendet liefert:

<?xml version="1.0" encoding="UTF-8"?>
<spalte name="1" id="A"/>
...
<spalte name="5" id="E"/>
...
<spalte name="26" id="Z"/>
<spalte name="27" id="AA"/>
...
<spalte name="52" id="AZ"/>
<spalte name="53" id="ABA"/>
...
<spalte name="78" id="ABZ"/>

Grüße
Thomas