我正在使用以下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[. > 0] - sum(current-group()/Amount[. < 0]))"/></Amount>
</xsl:copy>
</xsl:for-each-group>
</Report_Data>
</xsl:template>
</xsl:stylesheet>
我遇到的另一个问题是我没有正确的逻辑,但这可能是一个不同的帖子。
非常感谢任何形式的帮助或指导。
答案 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
值。