format-number - gibt es eine bessere Alternative?
hh
- xsl
0 Thomas J.S.0 Thomas J.S.0 hh
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:
<xsl:param name="Language" select="'de'"/>
<xsl:decimal-format name="en" decimal-separator="." grouping-separator=","/>
<xsl:decimal-format name="de" decimal-separator="," grouping-separator="."/>
<xsl:param name="NumberFormat">
<xsl:if test="$Language='de'">
<xsl:value-of select="'#.##0,##'"/>
</xsl:if>
<xsl:if test="$Language='en'">
<xsl:value-of select="'#,##0.##'"/>
</xsl:if>
</xsl:param>
<xsl:param name="PercentFormat">
<xsl:if test="$Language='de'">
<xsl:value-of select="'##0,0 %'"/>
</xsl:if>
<xsl:if test="$Language='en'">
<xsl:value-of select="'##0.0 %'"/>
</xsl:if>
</xsl:param>
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?
Gruß, Holger
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
...
<xsl:call-template name="myformatnumber">
<xsl:with-param name="number" select="wert/eines/elements/oder/attributes" />
</xsl:call-template>
müsste natürlich:
<xsl:with-param name="wert" select="wert/eines/elements/oder/attributes" /> lauten.
Thomas
Da hast du dich ja wieder einmal selbst übertroffen, ich nehme diese Vorlage natürlich gerne an ;-) Besten Dank dafür, muss dann nur noch schauen, ob sich dadurch die Parsing-Zeit wesentlich verändert. Eigentlich koennte ich auch schon wieder einen neues Problem berichten ;-( Ich stehe jetzt vor einem Problem, dass sich in Verbindung mit FOP auftut. Da FOP bzw. xsl:fo keine styles kennt, und die fo:declaration nicht in FOP unterstützt wird (zumindest noch nicht) stehe ich nun auf dem Schlauch und frage mich, wie man am dümmsten Eigenschaften definiert wie font-size, padding, background-color usw. das ging ja mit class="xxx" etwa in <td class="2stufe"/> usw. wunderbar, wenn man vorher td.2stufe {font-size:........} im <head/>-Bereich definiert hatte. Muss ich mal sehen, ob ich dafür auch so ein template schreiben kann ;-)
Gruß, Holger
Hallo,
Da hast du dich ja wieder einmal selbst übertroffen, ich nehme diese Vorlage natürlich gerne an ;-) Besten Dank dafür,
Bitte ;-)
Eigentlich koennte ich auch schon wieder einen neues Problem berichten ;-( Ich stehe jetzt vor einem Problem, dass sich in Verbindung mit FOP auftut. Da FOP bzw. xsl:fo keine styles kennt, und die fo:declaration nicht in FOP unterstützt wird (zumindest noch nicht) stehe ich nun auf dem Schlauch und frage mich, wie man am dümmsten Eigenschaften definiert wie font-size, padding, background-color usw.
Es bleibt nur die übliche Formatierung im Element selbst:
<fo:table-cell column-number="1" text-align="start" vertical-align="top" border-bottom-style="solid" border-width="0.1pt"> etc. wobei auch hier etwas Parametisierung möglich ist, z.B.: <fo:block font-size="8.5pt" font-family="{$font}" color="#000000"> etc.
Grüße
Thomas
das ging ja mit class="xxx" etwa in <td class="2stufe"/> usw. wunderbar, wenn man vorher td.2stufe {font-size:........} im <head/>-Bereich definiert hatte. Muss ich mal sehen, ob ich dafür auch so ein template schreiben kann ;-)
Gruß, Holger