当前位置: 首页 > 知识库问答 >
问题:

如何对多个元素值使用xsl group by

章鸿光
2023-03-14

我正在使用以下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个答案

姜宏放
2023-03-14

只有当代码为“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值。

 类似资料:
  • 问题内容: 请考虑以下示例 [+]输出:set([‘1’,‘3’,‘2’]) [+]输出:set([[‘1’,‘3’,‘2’,’set([3,4])’]) [+] set([‘1’,’[3,4]’,‘3’,‘2’,’set([3,4])’]) 根据https://redis-py.readthedocs.org/zh-CN/latest/中的官方文档, sadd(name,* values)添加值

  • 我有一个按钮和一个文本区: null null 现在我想让它们像这样向右或向左对齐: 运行代码段按钮和文本区如何向左对齐?

  • 问题内容: 据我了解,我可以将refs用于单个元素,如下所示: 如何为一系列元素实现此功能?显然不是这样:(即使我没有尝试,我也知道:) 我已经看到了这个,因此这个。但是,对于这种简单情况,我仍然感到困惑。 问题答案: ref最初只是对象。在组件渲染之间保留对此对象的引用。value主要用于组件引用,但可以容纳任何内容。 在某个时候应该有一组引用。如果渲染之间数组长度可能有所不同,则数组应相应缩放

  • 问题内容: 我有这样的课: 我想为每个MultiDataPoint生成 当然,在多个MultiDataPoints中,“键”可以相同。 因此,给定a ,如何使用Java 8流转换为? 这是我目前在没有流的情况下进行转换的方式: 问题答案: 这是一个有趣的问题,因为它表明有很多不同的方法可以达到相同的结果。下面我展示了三种不同的实现。 集合框架中的默认方法: Java 8向集合类中添加了一些与 St

  • 我在使用JAXB解析XML时遇到了这个问题。下面是所讨论的XML的简化布局: 我遇到的问题是,这些引用是在linkage标记下发送的,而linkage标记不是唯一的,而且也没有类似于根的“linkage”,这样我就可以轻松地用Java将其包装到列表中,因为generalInformation标记中有其他标记。以下是我到目前为止的设置方式: 所以我的问题是,如何配置GeneralInformatio

  • 我正在为SeleniumWebDriver测试框架使用PageObject模式 在我的pageObject类中,我有多个使用驱动程序的方法。findElement查找同一页面上存在的相同webelement 例如: 我的问题是: 1.如何避免在相同的WebElement变量上多次使用driver.findElement。我想要一种方法,一旦我找到网络,我将在任何其他方法中使用变量,而不使用driv