按相同值对节点进行分组并求和
Grouping nodes by same values and summing
我正在尝试按 pi:Date
和 pi:Code
对 pi:PD
进行分组并对它们的 pi:Amt
求和,但是,我的 for-each-group 代码不起作用。这是我的 XML.
<pi:PEE xmlns:pi="urn:com.workday/picof">
<pi:PG>
<pi:HDR>
<pi:Version>23</pi:Version>
</pi:HDR>
<pi:EMP>
<pi:EAD>
<pi:Code>1D</pi:Code>
<pi:Date>2017-05-08</pi:Date>
<pi:Amt>20.72</pi:Amt>
</pi:EAD>
<pi:PD>
<pi:Code>SDF</pi:Code>
<pi:Date>2021-02-19</pi:Date>
<pi:Amt>40</pi:Amt>
</pi:PD>
<pi:PD>
<pi:Code>SDB</pi:Code>
<pi:Date>2021-02-26</pi:Date>
<pi:Amt>2</pi:Amt>
</pi:PD>
<pi:PD>
<pi:Code>SDB</pi:Code>
<pi:Date>2021-02-26</pi:Date>
<pi:Amt>30</pi:Amt>
</pi:PD>
<pi:AI>
<pi:EDI>2020-05-01</pi:EDI>
</pi:AI>
</pi:EMP>
<pi:EMP>
...
</pi:EMP>
</pi:PG></pi:PEE>
这是我的 XSLT。我想知道缺少什么或错了什么,我可以用什么来改正。谢谢!
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pi="urn:com.workday/picof" version="2.0">
<xsl:output indent="yes" method="xml" />
<xsl:strip-space elements="*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="pi:EMP">
<xsl:if test="pi:EAD or pi:PD">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="pi:AI"/>
<xsl:template match="pi:PD">
<xsl:for-each-group select="." group-by="concat(pi:Date,pi:Code)">
<pi:PD>
<xsl:for-each select="current-group()">
<pi:Code><xsl:value-of select="pi:Code"/></pi:Code>
<pi:Date><xsl:value-of select="pi:Date"/></pi:Date>
<pi:Amt><xsl:value-of select="sum(current-group()/pi:Amt)"/></pi:Amt>
</xsl:for-each>
</pi:PD>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
只需转到父级别,运行 您的分组需要,您可以在其中组合 pi:EMP
和 pi:PD
模板,如下所示。 xsl:if
是用删除了 pi:AI
的空模板处理的。最后,内部 xsl:for-each>
不是必需的。 运行 下面是空模板和身份转换模板。
<xsl:template match="pi:EMP">
<xsl:copy>
<xsl:copy-of select="pi:EAD"/>
<xsl:for-each-group select="pi:PD" group-by="concat(pi:Date,pi:Code)">
<xsl:copy>
<xsl:copy-of select="pi:Code|pi:Date"/>
<pi:Amt><xsl:value-of select="sum(current-group()/pi:Amt)"/></pi:Amt>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
输出
<pi:PEE xmlns:pi="urn:com.workday/picof">
<pi:PG>
<pi:HDR>
<pi:Version>23</pi:Version>
</pi:HDR>
<pi:EMP>
<pi:EAD>
<pi:Code>1D</pi:Code>
<pi:Date>2017-05-08</pi:Date>
<pi:Amt>20.72</pi:Amt>
</pi:EAD>
<pi:PD>
<pi:Code>SDF</pi:Code>
<pi:Date>2021-02-19</pi:Date>
<pi:Amt>40</pi:Amt>
</pi:PD>
<pi:PD>
<pi:Code>SDB</pi:Code>
<pi:Date>2021-02-26</pi:Date>
<pi:Amt>32</pi:Amt>
</pi:PD>
</pi:EMP>
</pi:PG>
</pi:PEE>
我正在尝试按 pi:Date
和 pi:Code
对 pi:PD
进行分组并对它们的 pi:Amt
求和,但是,我的 for-each-group 代码不起作用。这是我的 XML.
<pi:PEE xmlns:pi="urn:com.workday/picof">
<pi:PG>
<pi:HDR>
<pi:Version>23</pi:Version>
</pi:HDR>
<pi:EMP>
<pi:EAD>
<pi:Code>1D</pi:Code>
<pi:Date>2017-05-08</pi:Date>
<pi:Amt>20.72</pi:Amt>
</pi:EAD>
<pi:PD>
<pi:Code>SDF</pi:Code>
<pi:Date>2021-02-19</pi:Date>
<pi:Amt>40</pi:Amt>
</pi:PD>
<pi:PD>
<pi:Code>SDB</pi:Code>
<pi:Date>2021-02-26</pi:Date>
<pi:Amt>2</pi:Amt>
</pi:PD>
<pi:PD>
<pi:Code>SDB</pi:Code>
<pi:Date>2021-02-26</pi:Date>
<pi:Amt>30</pi:Amt>
</pi:PD>
<pi:AI>
<pi:EDI>2020-05-01</pi:EDI>
</pi:AI>
</pi:EMP>
<pi:EMP>
...
</pi:EMP>
</pi:PG></pi:PEE>
这是我的 XSLT。我想知道缺少什么或错了什么,我可以用什么来改正。谢谢!
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pi="urn:com.workday/picof" version="2.0">
<xsl:output indent="yes" method="xml" />
<xsl:strip-space elements="*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="pi:EMP">
<xsl:if test="pi:EAD or pi:PD">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="pi:AI"/>
<xsl:template match="pi:PD">
<xsl:for-each-group select="." group-by="concat(pi:Date,pi:Code)">
<pi:PD>
<xsl:for-each select="current-group()">
<pi:Code><xsl:value-of select="pi:Code"/></pi:Code>
<pi:Date><xsl:value-of select="pi:Date"/></pi:Date>
<pi:Amt><xsl:value-of select="sum(current-group()/pi:Amt)"/></pi:Amt>
</xsl:for-each>
</pi:PD>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
只需转到父级别,运行 您的分组需要,您可以在其中组合 pi:EMP
和 pi:PD
模板,如下所示。 xsl:if
是用删除了 pi:AI
的空模板处理的。最后,内部 xsl:for-each>
不是必需的。 运行 下面是空模板和身份转换模板。
<xsl:template match="pi:EMP">
<xsl:copy>
<xsl:copy-of select="pi:EAD"/>
<xsl:for-each-group select="pi:PD" group-by="concat(pi:Date,pi:Code)">
<xsl:copy>
<xsl:copy-of select="pi:Code|pi:Date"/>
<pi:Amt><xsl:value-of select="sum(current-group()/pi:Amt)"/></pi:Amt>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
输出
<pi:PEE xmlns:pi="urn:com.workday/picof">
<pi:PG>
<pi:HDR>
<pi:Version>23</pi:Version>
</pi:HDR>
<pi:EMP>
<pi:EAD>
<pi:Code>1D</pi:Code>
<pi:Date>2017-05-08</pi:Date>
<pi:Amt>20.72</pi:Amt>
</pi:EAD>
<pi:PD>
<pi:Code>SDF</pi:Code>
<pi:Date>2021-02-19</pi:Date>
<pi:Amt>40</pi:Amt>
</pi:PD>
<pi:PD>
<pi:Code>SDB</pi:Code>
<pi:Date>2021-02-26</pi:Date>
<pi:Amt>32</pi:Amt>
</pi:PD>
</pi:EMP>
</pi:PG>
</pi:PEE>