【问题标题】:Isolate highest value per user ID using XSLT使用 XSLT 隔离每个用户 ID 的最高值
【发布时间】:2023-02-09 22:15:22
【问题描述】:

我已经按照“userId”的升序和“collectorValue”的降序排列了一组记录。

我需要为每个“userId”隔离最高/最顶层的“collectorValue”记录。我希望通过 XSLT 实现这一目标。

我的源 XML 是这样的:

<TimeCollector>
<TimeCollector>
  <collectorValue>4</collectorValue>
  <userId>UAT1101767</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
<TimeCollector>
  <collectorValue>2</collectorValue>
  <userId>UAT1101767</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
<TimeCollector>
  <collectorValue>3</collectorValue>
  <userId>UAT1103429</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
<TimeCollector>
  <collectorValue>5</collectorValue>
  <userId>UAT1103746</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
<TimeCollector>
  <collectorValue>3</collectorValue>
  <userId>UAT1103746</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
</TimeCollector>

我的目标 XML 应如下所示:

<TimeCollector>
<TimeCollector>
  <collectorValue>4</collectorValue>
  <userId>UAT1101767</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
<TimeCollector>
  <collectorValue>3</collectorValue>
  <userId>UAT1103429</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
<TimeCollector>
  <collectorValue>5</collectorValue>
  <userId>UAT1103746</userId>
  <startDate>2023-02-01T00:00:00.000</startDate>
</TimeCollector>
</TimeCollector>

我是 XSLT 的新手,需要帮助才能实现这一点。

谢谢

【问题讨论】:

  • 在询问 XSLT 问题时,您需要提供 minimal reproducible example:(1) 输入 XML。 (2) 您的逻辑,以及试图实现它的 XSLT。 (3) 期望的输出,基于上面 #1 中的示例 XML。 (4) XSLT 处理器及其符合的 XSLT 标准:1.0、2.0、3.0 或 4.0。

标签: xml xslt xslt-1.0


【解决方案1】:

请尝试以下解决方案。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

    <xsl:key name="TimeCollectorKey" match="TimeCollector/TimeCollector" use="userId"/>

    <xsl:template match="/TimeCollector">
        <xsl:copy>
            <xsl:for-each select="TimeCollector[generate-id(.) = generate-id(key('TimeCollectorKey', userId)[1])]">
                <xsl:sort select="userId" order="ascending"/>
                <xsl:sort select="collectorValue" order="descending"/>
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 2019-07-01
    • 2022-07-29
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多