3

次のような単純な入力 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 に制限されており、キーとノードセットを使用していくつかの回答を見ましたが、それらを適用する方法を理解できません。

4

1 に答える 1

2

この XSLT 1.0 変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common" exclude-result-prefixes="ext">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:variable name="vrtfTaxSeq">
       <xsl:apply-templates/>
     </xsl:variable>

     <xsl:value-of select="sum(ext:node-set($vrtfTaxSeq)/*)"/>
 </xsl:template>

 <xsl:template match="item">
  <ttax>
   <xsl:value-of select="round(0.0495*(Base - 0.08*Base + Tax1 + Tax2))"/>
  </ttax>
 </xsl:template>
</xsl:stylesheet>

提供された 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>

それぞれの合計を計算し、必要なitem結果を生成します。

714

xxx:node-set()拡張関数が必要であることに注意してください (これは再帰を使用して回避できます)。

于 2012-10-31T02:07:21.220 に答える