如何使用xsl group-by表示多个元素值

时间:2016-05-18 23:22:14

标签: xml xslt

我正在使用以下xml结构:

    <?xml version="1.0" encoding="UTF-8"?>
    <Report_Data>
        <Report_Entry>
            <ID>10513</ID>
            <Code>XXX</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>100</Amount>
        </Report_Entry>
        <Report_Entry>
            <ID>10513</ID>
            <Code>XXX</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>-25</Amount>
        </Report_Entry>
        <Report_Entry>
            <ID>12076</ID>
            <Code>HHH</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>100</Amount>
        </Report_Entry>
        <Report_Entry>
            <ID>12166</ID>
            <Code>HHH</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>5</Amount>
        </Report_Entry>
        <Report_Entry>
            <ID>12166</ID>
            <Code>HHH</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>35</Amount>
        </Report_Entry>
    </Report_Data>

我需要仅在代码为“XXX”时按ID和代码进行分组,并将金额相加。所以最后,我的最终输出应该如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <Report_Data>
        <Report_Entry>
            <ID>10513</ID>
            <Code>XXX</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>75</Amount>
        </Report_Entry>
        <Report_Entry>
            <ID>12076</ID>
            <Code>HHH</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>100</Amount>
        </Report_Entry>
        <Report_Entry>
            <ID>12166</ID>
            <Code>HHH</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>5</Amount>
        </Report_Entry>
        <Report_Entry>
            <ID>12166</ID>
            <Code>HHH</Code>
            <Payment_Date>2016-05-05-07:00</Payment_Date>
            <Amount>35</Amount>
    </Report_Entry>

我知道如何按多个元素进行分组,但我无法弄清楚如何通过元素值来调整组。我没有非常涉足xsl,所以我的知识有点缺乏。我尝试使用下面的xsl(反正最新版本):

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">

    <xsl:template match="Report_Data">
        <Report_Data>
            <xsl:for-each-group select="Report_Entry" group-by="concat(ID,' ',Code)">
                <xsl:copy>
                    <xsl:copy-of select="ID"/>
                    <xsl:copy-of select="Code"/>
                    <xsl:copy-of select="Payment_Date"/>
                    <Amount><xsl:value-of select="sum(current-group()/Amount[. &gt; 0] - sum(current-group()/Amount[. &lt; 0]))"/></Amount>
                </xsl:copy>
            </xsl:for-each-group>
        </Report_Data>
    </xsl:template>
   </xsl:stylesheet>

我遇到的另一个问题是我没有正确的逻辑,但这可能是一个不同的帖子。

非常感谢任何形式的帮助或指导。

1 个答案:

答案 0 :(得分:0)

  

我需要仅在代码为“XXX”

时按ID和代码进行分组

我认为您要说的是,您希望按照其ID将代码“XXX”分组,并将所有其他条目保留原样。这将以这种方式完成:

XSLT 2.0

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

<xsl:template match="/Report_Data">
    <Report_Data>
        <xsl:for-each-group select="Report_Entry[Code='XXX']" group-by="ID">
            <Report_Entry>
                <xsl:copy-of select="ID | Code | Payment_Date"/>
                <Amount>
                    <xsl:value-of select="sum(current-group()/Amount)"/>
                </Amount>
            </Report_Entry>
        </xsl:for-each-group>
        <xsl:copy-of select="Report_Entry[not(Code='XXX')]"/>
    </Report_Data>
</xsl:template>

</xsl:stylesheet> 

请注意,Payment_Date值取自组中的第一个条目。至少在理论上,同一组中的其他条目可能具有其他Payment_Date值。