基于第二节点的节点的XML总和

时间:2015-04-15 16:51:35

标签: xml xslt

我正在尝试为每个用户添加匹配类型的总金额。 XML示例:

<Report_Data>
    <Report_Entry>
        <Name>Mark</Name>
        <Pay>
            <Type>1</Type>
            <Amount>3013</Amount>
        </Pay>
        <Pay>
            <Type>1</Type>
            <Amount>3013</Amount>
        </Pay>
        <Pay>
            <Type>2</Type>
            <Amount>26</Amount>
        </Pay>
    <Report_Entry>
    <Report_Entry>
        <Name>Luke</Name>
        <Pay>
            <Type>1</Type>
            <Amount>2600</Amount>
        </Pay>
        <Pay>
            <Type>1</Type>
            <Amount>3500</Amount>
        </Pay>
        <Pay>
            <Type>3</Type>
            <Amount>1600</Amount>
        </Pay>
    <Report_Entry> 
<Report_Data>

XSL 2.0

输出应该类似于Name / Type / Amount。

Mark16026

Mark20026

Luke16100

Luke31600

我的格式很好,但是,循环只输出第一种类型。

谢谢:)

编辑:这是XSLT片段。这是300万行xml和600行xslt的一部分。我故意把它淡化,因为我错过了(右)循环。

<xsl:template match="wd:Report_Data">
<xsl:for-each select="wd:Report_Entry">
<xsl:variable name="Worker" select="." />
        <xsl:for-each-group select="//Pay" group-by="wd:Type"> 
            <xsl:variable name="Money" select="." />
            <xsl:for-each select="tokenize(Type, ' ')">
                <xsl:if test="(.!='0')"> 
  <xsl:call-template name="FormatFixedWidthString">
            <xsl:with-param name="size">4</xsl:with-param>
            <xsl:with-param name="stringValue">
                <xsl:value-of select="$Worker/Name"/>
            </xsl:with-param>
            <xsl:with-param name="justify">right</xsl:with-param>
            <xsl:with-param name="fill">
                <xsl:text></xsl:text>
            </xsl:with-param>
        </xsl:call-template>
 <xsl:call-template name="FormatFixedWidthString">
            <xsl:with-param name="size">1</xsl:with-param>
            <xsl:with-param name="stringValue">
                <xsl:value-of select="$Money/Type"/>
            </xsl:with-param>
            <xsl:with-param name="justify">right</xsl:with-param>
            <xsl:with-param name="fill">
                <xsl:text></xsl:text>
            </xsl:with-param>
        </xsl:call-template>
 <xsl:call-template name="FormatFixedWidthString">
            <xsl:with-param name="size">4</xsl:with-param>
            <xsl:with-param name="stringValue">
                <xsl:value-of select="$Money/Value"/>
            </xsl:with-param>
            <xsl:with-param name="justify">right</xsl:with-param>
            <xsl:with-param name="fill">
                <xsl:text>0</xsl:text>
            </xsl:with-param>
        </xsl:call-template>
</xsl:for-each>
</xsl:for-each-group>
</xsl:for-each>
</xsl:template>

1 个答案:

答案 0 :(得分:2)

如果您使用

<xsl:template match="Report_Entry">
  <xsl:for-each-group select="Pay" group-by="Type">
    <xsl:value-of select="../Name, current-grouping-key(), sum(current-group()/Amount)"/>
    <xsl:text>&#10;</xsl:text>
  </xsl:for-each-group>
</xsl:template>

然后你应该得到你想要的总和。

在您发布的代码中,我认为您需要更改

<xsl:for-each-group select="//Pay" group-by="wd:Type">

<xsl:for-each-group select="Pay" group-by="wd:Type">

<xsl:for-each-group select=".//Pay" group-by="wd:Type">

仅处理Pay内的Report_Entry元素。

如果你想计算总和,那么你需要使用

<xsl:with-param name="stringValue" select="sum(current-group()/Value)"/>

而不是

        <xsl:with-param name="stringValue">
            <xsl:value-of select="$Money/Value"/>
        </xsl:with-param>