私のXSLTファイルでは、入力XMLに小数点以下が含まれるかどうかに応じて、条件付きで小数点とともに価格を表示する必要があります。 XMLは2つのタイプの値を持つXMLファイルを受け取ることができます - XMLには小数点以下2桁までの価格が含まれます(これをDecimal-XMLと呼びます)、または価格は最も近い整数に切り上げられます1つの「Integer-XML」)。XSLT入力XMLに基づく小数点フォーマット
私の問題は、XSLTファイルで可能な限りリファクタリングする必要がありますが、XML入力と同じ形式でXHTMLに変換を適用する必要があるということです。これを実現するためには、私が実装され、私のチームには3つのガイドライン提案:値が計算に計算したり、変数に格納されているときに、すべてのformat-number()
関数呼び出し
- 削除を。代わりに
number(<value>)
を使用してください。ただし、このルールには特定の条件が適用されます(下記参照)。 - 値を表示する場合は、
format-number(<value>, '#.##')
形式を使用します。これにより、XMLに元々存在する整数値または小数点値が確実に表示されます。 - オプションのタグ(「割引」など)の場合は、値が計算されている場合でも
format-number(<value>, '0.00')
関数を使用します。これは、タグが存在しない場合、値を取得しようとするとNaN
の結果が得られるため必要です。それがすべてではないが、ほとんどの場合で動作し、HTMLコメントの注意点としては<x:stylesheet version="1.0" xmlns:x="http://www.w3.org/1999/XSL/Transform"> <x:template match="/"> <html> <body> <table border="1" width="60%"> <tr> <th>Simple</th> <th>number()</th> <th>format-number(<expression>, '0.00')</th> <th>format-number(<expression>, '#.##')</th> </tr> <x:apply-templates /> </table> </body> </html> </x:template> <x:template match="Item"> <x:variable name="qty" select="number(@numItems)" /> <x:variable name="cost" select="number(ItemCost) * $qty" /> <x:variable name="extraCharges" select="(number(Tax) + number(TxnFee)) * $qty"/> <x:variable name="discount" select="format-number(Discount, '0.00') * $qty"/> <tr> <td> <!-- Works for Integer-XML, but values in Decimal-XML are *sometimes* rendered upto 14 decimal places. Even though Quickwatch shows it correctly in the debugger in VS. I cannot figure out what's special about the error cases. --> <x:value-of select="$cost + $extraCharges - $discount"/> </td> <td> <!-- Works same as the above case. --> <x:value-of select="number($cost + $extraCharges - $discount)"/> </td> <td> <!-- Works for Decimal-XML, but values in Integer-XML are always rendered with decimal digits. --> <x:value-of select="format-number(($cost + $extraCharges - $discount), '0.00')"/> </td> <td> <!-- Works for Integer-XML, but some values in Decimal-XML are rendered incorrectly. For example, 95.20 is rendered as 95.2; 95.00 is rendered as 95 --> <x:value-of select="format-number(($cost + $extraCharges - $discount), '#.##')"/> </td> </tr> </x:template> </x:stylesheet>
:ここ
は、XSLTの例示的な一例です。
私は、表示形式を決定するためにXSLTに渡されるブール型パラメータをさらに必要とする「when-otherwise」構成をどこにでも適用するのではなく、入力と同じ価格をすべてフォーマットする単一式を使用したいと考えています。 XSLTの現在の状態は、format-number(<expression>, '0')
を使用して、入力に関係なくすべての数値が四捨五入されていることです。
どうすればよいですか?
編集: Dimitreさんのコメントの後、私は、サンプルのXML(および上記のXSLT)を作成することを決めたので、専門家は簡単にそれを試してみることができます。
サンプルXMLは(この1つは、小数点以下が含まれています):
<ShoppingList>
<Item numItems="2">
<ItemCost>10.99</ItemCost>
<Tax>3.99</Tax>
<TxnFee>2.99</TxnFee>
<Discount>2.99</Discount>
</Item>
<Item numItems="4">
<ItemCost>15.50</ItemCost>
<Tax>5.50</Tax>
<TxnFee>3.50</TxnFee>
<Discount>3.50</Discount>
</Item>
</ShoppingList>
可能な限り単純なXMLドキュメントでも提供することを忘れました。これは役に立たない。 –
@ Dimitre:私はそれを提供することを忘れていませんでしたが、これは実際に変換の問題ではないので、ソースXMLが必要であることを認識していないことを認めなければなりません。小数点の書式設定に関する一般的な質問です。それでも助けがあれば、私はそれを作成しようとします。 – Cerebrus