次のような単純な入力 XML ドキュメントがあるとします。
<Amounts>
<item>
<Base>4750</Base>
<Tax1>2800</Tax1>
<Tax2>50</Tax2>
</item>
<item>
<Base>4750</Base>
<Tax1>2800</Tax1>
<Tax2>50</Tax2>
</item>
</Amounts>
XSLT は次のようになります。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="1.0" method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:element name="MyTax">
<xsl:variable name="bf" select="sum(//item/Base)"/>
<xsl:variable name="discount" select="$bf * 0.08"/>
<xsl:variable name="bf1" select="$bf - $discount"/>
<xsl:variable name="yq1" select="sum(//item/Tax1)"/>
<xsl:variable name="yr1" select="sum(//item/Tax2)"/>
<xsl:variable name="stax">
<xsl:value-of select="round(format-number((($bf1 + $yq1 + $yr1) * 0.0495),'#.##'))"/>
</xsl:variable>
<xsl:element name="Stax"><xsl:value-of select="$stax"/></xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
出力 XML は次のようになります。
<MyTax>
<Stax>715</Stax>
</MyTax>
ただし、各アイテムのスタックスを個別に計算し、それらのアイテムを合計したいと思います-これは、上記の例では、個々のスタックスの合計が実際には714であるため、丸め誤差が発生するためです-私が探している値上記の 715 ではなく for。
したがって、私が探している出力は次のようになります。
<MyTax>
<item>
<Stax>357</Stax>
</item>
<item>
<Stax>357</Stax>
</item>
<TotalStax>714</TotalStax>
</MyTax>
for-each を設定することはできますが、stax を各パスの変数に計算し、個々の stax を合計するにはどうすればよいでしょうか? 私は XSLT 1.0 に制限されており、キーとノードセットを使用していくつかの回答を見ましたが、それらを適用する方法を理解できません。