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

XSLT将最近的条目按键分组

莫誉
2023-03-14

我需要按键值保留输入xml分组中的最新条目。可以用xsl 2.0实现吗?输入

<root>
<line>
    <date>2021-01-01T00:00:00</date>
    <field1>AAA</field1>
    <field2>1</field2>
</line>
<line>
    <date>2021-01-01T23:00:00</date>
    <field1>BBB</field1>
    <field2>1</field2>
</line>
<line>
    <date>2021-01-02T00:00:00</date>
    <field1>CCC</field1>
    <field2>2</field2>
</line>
<root>
<line>
    <date>2021-01-01T23:00:00</date>
    <field1>BBB</field1>
    <field2>1</field2>
</line>
<line>
    <date>2021-01-02T00:00:00</date>
    <field1>CCC</field1>
    <field2>2</field2>
</line>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:template match="/">
    <xsl:for-each-group select="root/line" group-by="field2">
        <xsl:sort select="date"/>
        <line>
            <xsl:copy-of select="node()"/>
        </line>
    </xsl:for-each-group>
</xsl:template>

共有1个答案

淳于鹏
2023-03-14

尝试对组进行排序,而不是对每个组中的行进行排序。然后复制每个组中的第一个节点。

要通过排序来做到这一点,您需要做如下操作:

XSLT2.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="/root">
    <xsl:copy>
        <xsl:for-each-group select="line" group-by="field2">
            <xsl:variable name="sorted-group">
                <xsl:perform-sort select="current-group()">
                    <xsl:sort select="date" order="descending"/>
                </xsl:perform-sort>            
            </xsl:variable>
            <xsl:copy-of select="$sorted-group/line[1]"/>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意,这只会按降序复制第一行。如果有两行具有相同的日期,则仅将其中的第一行(按文档顺序)复制到输出中。

或者,您可以选择组中日期时间最长的行:

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

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each-group select="line" group-by="field2">
            <xsl:variable name="max-dateTime" select="max(current-group()/date/xs:dateTime(.))" />
            <xsl:copy-of select="current-group()[date=$max-dateTime]"/>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

在这里,平局将通过复制两行来解决。

 类似资料:
  • 问题内容: 从下面的数据中,我需要使用SQL Server 2005为每个链接ID选择最接近指定日期的记录: 因此,使用01/10/2010选择它们应返回: 我知道这是有可能的,但似乎无法绕开我的头脑(必须太接近一天的结束了:P)如果有人可以帮助或朝正确的方向轻轻推一下,将不胜感激! 编辑: 另外我也遇到了这个sql以获取最接近的日期: 但无法弄清楚如何正确地整合到查询中… 谢谢 问题答案: 你可

  • type String(可选) - 以下之一: tasks - 此类别中的项目将被放置到标准的 Tasks 类别中。只能有一个这样的类别而且总是显示在跳转列表的底部。 frequent - 显示由应用程序频繁打开的文件的列表,类别的名称及其项目由Windows设置。 recent - 显示由应用程序最近打开的文件的列表,类别的名称及其项目由Windows设置。项目可以使用app.addRecent

  • 问题内容: 我试图弄清楚如何将货币金额向上舍入至最接近的5美分。以下显示了我的预期结果 我需要结果的精度为2(如上所示)。 更新资料 按照下面的建议,我能做的就是 我不认为这是100%的原始数据-我担心在转换为双精度和从双精度转换时精度可能会丢失。但是,这是到目前为止我能想到的最好的方法,并且 似乎 可以解决。 问题答案: 您可以使用普通双精度来做到这一点。 编辑:对于负数,您需要减去0.5

  • 问题内容: 我有一个清单: 如何将带有动态间隙的最近值分组,并创建这样的元组,最快的方法是什么?: 问题答案: 喜欢 首先,我们计算顺序元素之间的平均差异,然后将差异小于平均值的元素分组在一起。

  • 问题内容: 我有一个看起来与此类似的表: 我该如何在Postgres中编写查询以仅返回按表中每个唯一字符分组的最新(按)行? 问题答案: 用途:

  • 问题内容: 我需要将时间四舍五入到最接近的四分之一小时。时间是从MySQL数据库的datetime列中提取的,格式如。 例: 10:50必须是10:45 1:12必须是1:00 3:28必须是3:15 等等 我假设参与其中,但不确定如何去做。 谢谢 问题答案: 您的全部功能将是这样的…