我正在尝试为每个用户添加匹配类型的总金额。 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>
答案 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> </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>