2

XSL v1.0 で正と負の値を別々に合計しようとしています。

次のような XML があります。

<Billing_Statements>
    <Statement_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>XX</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>XX</Consumption>
            </Meter_Details>
        </Invoice_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>XX</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>XX</Consumption>
            </Meter_Details>
        </Invoice_Details>
    </Statement_Details>
</Billing_Statements>

XX は正または負の値です。

Statement_Details ごとにすべての Invoice_Detail ノードの正の値の合計を最初に出力し、次に負の値の合計を出力する必要があります。

現時点で私が試した:

<xsl:value-of select="sum(Invoice_Details/Meter_Details[Consumption &lt; 0])" />

0これの多くのバリエーションがあり、それらはすべて何があっても合計を返します。

Meter_Details ノードから他のすべての情報を収集すると、for-each セクションは次のように完全に機能します。

<xsl:for-each select="Invoice_Details/Meter_Details[Consumption &lt; 0]">

そして、負または正の値を持つノードのみを選択します。これが sum() で機能しないのはなぜですか?

私は確かにここで XSL に苦労しています。

4

1 に答える 1

0

使用:

sum(*/*/*[. >=0])

sum(*/*/*[not(. >=0)])

これら 2 つの相対 XPath 式を使用する完全な変換を次に示します。

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

 <xsl:template match="Statement_Details">

Statement <xsl:value-of select="position()"/>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="Invoice_Details">
  Invoice <xsl:value-of select="position()"/>
    Positive: <xsl:value-of select="sum(*/*[. >=0])"/>
    Negative: <xsl:value-of select="sum(*/*[not(. >=0)])"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメント(必要な構造を持つ) に適用されると、次のようになります。

<Billing_Statements>
    <Statement_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>-3</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>5</Consumption>
            </Meter_Details>
        </Invoice_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>8</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>-12</Consumption>
            </Meter_Details>
        </Invoice_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>22</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>3</Consumption>
            </Meter_Details>
        </Invoice_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>4</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>-5</Consumption>
            </Meter_Details>
        </Invoice_Details>
    </Statement_Details>
    <Statement_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>-13</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>25</Consumption>
            </Meter_Details>
        </Invoice_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>77</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>-15</Consumption>
            </Meter_Details>
        </Invoice_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>31</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>-3</Consumption>
            </Meter_Details>
        </Invoice_Details>
        <Invoice_Details>
            <Meter_Details>
                <Consumption>-87</Consumption>
            </Meter_Details>
            <Meter_Details>
                <Consumption>54</Consumption>
            </Meter_Details>
        </Invoice_Details>
    </Statement_Details>
</Billing_Statements>

必要な正しい結果が生成されます。

Statement 1
  Invoice 1
    Positive: 5
    Negative: -3
  Invoice 2
    Positive: 8
    Negative: -12
  Invoice 3
    Positive: 25
    Negative: 0
  Invoice 4
    Positive: 4
    Negative: -5

Statement 2
  Invoice 1
    Positive: 25
    Negative: -13
  Invoice 2
    Positive: 77
    Negative: -15
  Invoice 3
    Positive: 31
    Negative: -3
  Invoice 4
    Positive: 54
    Negative: -87
于 2013-03-19T04:00:56.760 に答える