Thomas J.S.: format-number - gibt es eine bessere Alternative?

Beitrag lesen

Hallo,

Parameter für die Sprache wird im parsing-prozess dem Parameter $Language zugewiesen, entweder de oder en. Nun sollen auch die Werte mit den richtigen Trennzeichen angegeben werden. Eigentlich habe ich eine Lösung schon gefunden, aber ich wollte mal nachfragen, ob es dafür eine elegantere Variante gibt, habe im WWW und Forum nichts gefunden.

Globale Definition der Varaiblen im kopf des xsl-Datei:
Später wird ein Wert mit dem entsprechenden Wert in dieser Form aufgerufen:

<xsl:value-of select="format-number(Wert,$FormatNumber,$Language)"/>

oder für Prozentangaben:

<xsl:value-of select="format-number(Wert,$PercentNumber,$Language)"/>

Gibt es elegantere Varianten?

Ob eleganter ist, weiss ich nicht, aber es bietet sich an, solche Sachen in einem Template zu unterbrignen. Damit wären Erweiterungen für Sprache etc. weniger problematsich und die Paramter können auch dynamisch (d.h. aus einem XML-Element oder -Attribut ausgelesen und) zugewiesen werden.

<xsl:decimal-format name="de" decimal-separator="," grouping-separator="." />
<xsl:decimal-format name="en" decimal-separator="." grouping-separator="," />
<xsl:template name="myformatnumber">
 <xsl:param name="wert" />
 <xsl:param name="lang" />
 <xsl:param name="style" />
 <xsl:param name="scale" />
 xsl:choose
  <xsl:when test="$style = 'percent'">
   xsl:choose
    <xsl:when test="$lang = 'de'">
     xsl:choose
      <xsl:when test="$scale = '0'"><xsl:value-of select="format-number($wert, '#.##0 %', 'de')" /></xsl:when>
      <xsl:when test="$scale = '1'"><xsl:value-of select="format-number($wert, '#.##0,0 %', 'de')" /></xsl:when>
      <xsl:when test="$scale = '2'"><xsl:value-of select="format-number($wert, '#.##0,00 %', 'de')" /></xsl:when>
      <xsl:when test="$scale = '4'"><xsl:value-of select="format-number($wert, '#.##0,0000 %', 'de')" /></xsl:when>
      xsl:otherwise<xsl:value-of select="format-number($wert, '#.##0,00 %', 'de')" /></xsl:otherwise>
     </xsl:choose>
    </xsl:when>
    xsl:otherwise
     xsl:choose
      <xsl:when test="$scale = '0'"><xsl:value-of select="format-number($wert, '#,##0 %', 'en')" /></xsl:when>
      ...
      xsl:otherwise<xsl:value-of select="format-number($wert, '#,##0.00 %', 'en')" /></xsl:otherwise>
     </xsl:choose>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:when>
  xsl:otherwise
   xsl:choose
    <xsl:when test="$lang = 'de'">
     xsl:choose
      <xsl:when test="$scale = '0'"><xsl:value-of select="format-number($wert, '#.##0', 'de')" /></xsl:when>
      ...
      xsl:otherwise<xsl:value-of select="format-number($wert, '#.##0,00', 'de')" /></xsl:otherwise>
     </xsl:choose>
    </xsl:when>
    xsl:otherwise
     xsl:choose
      <xsl:when test="$scale = '0'"><xsl:value-of select="format-number($wert, '#,##0', 'en')" /></xsl:when>
      ...
      xsl:otherwise<xsl:value-of select="format-number($wert, '#,##0.00', 'en')" /></xsl:otherwise>
     </xsl:choose>
    </xsl:otherwise>
   </xsl:choose>
  </xsl:otherwise>
 </xsl:choose>
</xsl:template>

An der gewünschten Stelle dann mit call-template arbeiten: durch das Template werden in den otherwise-Zweigen die default Formate festgelegt und so kann das Template ja nach Bedarf mit allen oder nur mit einigen Paramter aufgerufen werden.
Ein:

<xsl:call-template name="myformatnumber">
    <xsl:with-param name="number" select="wert/eines/elements/oder/attributes" />
   </xsl:call-template>

würde demnach eine Dezimal-Formtierung in English in der Form: "1,234.00" erzeugen.

Grüße
Thomas